【问题标题】:Python: importing module from subdirectory that loads non-python file with relative pathPython:从加载具有相对路径的非python文件的子目录导入模块
【发布时间】:2016-11-30 22:45:12
【问题描述】:

这是我尝试构建专业结构/层次结构的第一个 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 文件的 pandas 数据框。运行 main.py 时出现错误 IOError: File file.csv 不存在。我可以通过在“file.csv”之前添加一个路径前缀来解决这个问题:

if __name__=='__main__':
    path_prefix=''
else:
    path_prefix='data_lib/'

这是标准的解决方案和编程实践,还是我应该避免这种情况并做其他事情(尤其是因为 csv 文件需要定期更新而不会影响任何其他代码文件)?

【问题讨论】:

    标签: python import path


    【解决方案1】:

    在这种情况下,一个常见的习惯用法是在所有文件路径前加上模块的绝对路径:

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

    这样,无论你从哪里调用模块,你仍然可以从模块内加载资源。

    按照您的描述添加路径前缀仅在您从父目录调用模块时才有效。当你从其他地方调用它时会发生什么?

    【讨论】:

    • 谢谢,这很有帮助,而且很容易改变。我知道在这个例子中命名我的文件 file.csv 会有问题。读者请注意_file_是一个内置名称,与我的文件名无关!
    • 是的,__file__ 是一个内置函数,它给出了调用模块的文件的路径名。另外,如果它解决了您的问题,值得接受这个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多