Python:从相关路径加载非python文件的子目录导入模块
问题描述:
这是我尝试构建专业结构/层次结构的第一个python项目。我有以下目录结构:Python:从相关路径加载非python文件的子目录导入模块
project/
---__init__.py
---main.py
---data_lib/
------__init__.py
------load.py
------file.csv
在load.py的代码是:
import pandas as pd
def load_csv():
print pd.read_csv('file.csv')
if __name__=='__main__':
load_csv()
在main.py的代码是:
from data_lib.load import load_csv
load_csv()
当运行load.py我自己获得了加载的csv文件的熊猫数据框的打印输出。当main.py运行时,我得到错误IOError:文件file.csv不存在。我可以通过添加“之前FILE.CSV”的路径前缀解决这个定义为:
if __name__=='__main__':
path_prefix=''
else:
path_prefix='data_lib/'
这是标准的解决方案和编程习惯或者我应该避免这一点,做别的事情,而不是(尤其是因为csv文件将会在没有任何其他代码文件受到影响的情况下定期更新)?
答
在这样的情况下,一个常见的成语是使用绝对路径所有的文件路径前缀为您的模块:
from os import path
path_prefix = path.dirname(path.abspath(__file__))
csv_path = path.join(path_prefix, 'file.csv')
这样也没关系,你是从调用模块,你会仍然能够从模块内加载资源。
如上所述,添加路径前缀将仅在从父目录调用模块时起作用。当你从别的地方打电话时会发生什么?
谢谢,这是有帮助的,并且一个简单的改变。我知道在这个例子中命名我的文件file.csv会有问题。读者应该注意\ __ file__是一个内置的名称,并且与我的文件名无关! – Attack68
是的,'__file__'是一个内置的,它给出你的模块被调用的文件的路径名。此外,值得接受这个答案,如果它解决了你的问题。 –