在python项目中使用相对路径读取文件

新手上路,请多包涵

假设我有一个结构如下的 python 项目:

 project
    /data
        test.csv
    /package
        __init__.py
        module.py
    main.py

__init__.py :

 from .module import test

module.py :

 import csv

with open("..data/test.csv") as f:
    test = [line for line in csv.reader(f)]

main.py

 import package

print(package.test)

当我运行 main.py 时,出现以下错误:

  C:\Users\Patrick\Desktop\project>python main.py
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    import package
  File "C:\Users\Patrick\Desktop\project\package__init__.py", line 1, in <module>
    from .module import test
  File "C:\Users\Patrick\Desktop\project\package\module.py", line 3, in <module>
    with open("../data/test.csv") as f:
FileNotFoundError: [Errno 2] No such file or directory: '../data/test.csv'

但是,如果我从 package 目录运行 module.py ,我不会收到任何错误。因此,似乎 open(...) 中使用的相对路径仅相对于原始文件的运行位置(即 __name__ == "__main__" )?我不想使用绝对路径。有什么方法可以解决这个问题?

原文由 pbreach 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 668
2 个回答

相对路径是相对于 当前工作目录 的。如果您不希望自己的道路成为现实,那么它必须是绝对的。

但是有一个常用的技巧可以从当前脚本构建绝对路径:使用它的 __file__ 特殊属性:

 from pathlib import Path

path = Path(__file__).parent / "../data/test.csv"
with path.open() as f:
    test = list(csv.reader(f))

这需要 python 3.4+(对于 pathlib 模块)。

如果您仍然需要支持旧版本,您可以获得相同的结果:

 import csv
import os.path

my_path = os.path.abspath(os.path.dirname(__file__))
path = os.path.join(my_path, "../data/test.csv")
with open(path) as f:
    test = list(csv.reader(f))

[ 2020 年编辑: python3.4+ 现在应该是常态,所以我首先移动了受 jpyams 评论启发的 pathlib 版本]

原文由 spectras 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于 Python 3.4+:

 import csv
from pathlib import Path

base_path = Path(__file__).parent
file_path = (base_path / "../data/test.csv").resolve()

with open(file_path) as f:
    test = [line for line in csv.reader(f)]

原文由 aksh1618 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题