如何在AppEngine中使用Python打开父目录中的文件?
我有一个名为module/mod.py的Python文件,其中包含以下代码:
f = open('../data.yml')
z = yaml.load(f)
f.close()
data.yml文件在模块的上一级目录中。我遇到的错误是:
IOError: [Errno 13] file not accessible: '../data.yml'
我正在使用AppEngine SDK 1.3.3。
这个有什么解决办法吗?
如何在AppEngine中使用Python打开父目录中的文件?
我有一个名为module/mod.py的Python文件,其中包含以下代码:
f = open('../data.yml')
z = yaml.load(f)
f.close()
data.yml文件在模块的上一级目录中。我遇到的错误是:
IOError: [Errno 13] file not accessible: '../data.yml'
我正在使用AppEngine SDK 1.3.3。
这个有什么解决办法吗?
open
函数的操作是相对于当前进程工作目录,而不是调用它的模块。如果路径必须是相对于模块的,请按照以下方式执行:
import os.path
f = open(os.path.dirname(__file__) + '/../data.yml')
在遇到这个问题并对答案不满意后,我发现了一个不同的解决方案。要达到我想要的结果,需要进行以下步骤:
使用 os.path.dirname
确定当前目录:
current_directory = os.path.dirname(__file__)
使用 os.path.split
确定父目录:
parent_directory = os.path.split(current_directory)[0] # 如有必要,请重复执行
将父目录与任何子目录连接起来:
file_path = os.path.join(parent_directory, 'path', 'to', 'file')
打开文件:
open(file_path)
组合在一起:
open(os.path.join(os.path.split(os.path.dirname(__file__))[0], 'path', 'to', 'file')
替代方案
你也可以使用 sys
模块来获取当前工作目录。
因此,另一个实现相同功能的替代方案为:
import sys
f = open(sys.path[0] + '/../data.yml')
import sys
def get_parent_directory():
list = sys.path[0].split('/')[:-1]
return_str = ''
for element in list:
return_str += element + '/'
return return_str.rstrip('/')
os.path.dirname
或类似的专用函数,而不是自己重新发明它们。另外,连接字符串的更正确的方式是'/'.join(list)
。 - ont.rif@ThatsAmorais的答案在一个函数中
import os
def getParent(path: str, levels=1) -> str:
"""
@param path: starts without /
@return: Parent path at the specified levels above.
"""
current_directory = os.path.dirname(__file__)
parent_directory = current_directory
for i in range(0, levels):
parent_directory = os.path.split(parent_directory)[0]
file_path = os.path.join(parent_directory, path)
return file_path
code
用反引号包裹起来。 - Marcelo Cantos