2016-11-30 75 views
1

这是我尝试构建专业结构/层次结构的第一个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文件将会在没有任何其他代码文件受到影响的情况下定期更新)?

回答

0

在这样的情况下,一个常见的成语是使用绝对路径所有的文件路径前缀为您的模块:

from os import path 

path_prefix = path.dirname(path.abspath(__file__)) 
csv_path = path.join(path_prefix, 'file.csv') 

这样也没关系,你是从调用模块,你会仍然能够从模块内加载资源。

如上所述,添加路径前缀将仅在从父目录调用模块时起作用。当你从别的地方打电话时会发生什么?

+0

谢谢,这是有帮助的,并且一个简单的改变。我知道在这个例子中命名我的文件file.csv会有问题。读者应该注意\ __ file__是一个内置的名称,并且与我的文件名无关! – Attack68

+0

是的,'__file__'是一个内置的,它给出你的模块被调用的文件的路径名。此外,值得接受这个答案,如果它解决了你的问题。 –