如何通过文件到模块的相对路径读取文件?

时间:2019-01-09 14:47:02

标签: python file directory

目录结构:

├--- mod
|    ├--- __init__.py
|    └--- abc.data
└--- test.py

__ init __。py:

with open("abc.data", 'r') as f:
    pass # read and process the data

test.py:

import mod

上面的程序应该读取文件abc.data中的数据,但是它给出了错误:

FileNotFoundError: [Errno 2] No such file or directory: 'abc.data'

这是因为Python解释器的当前目录test.py的父目录。

那么无论abc.data的位置如何,如何在模块mod中读取test.py


实际上,以下代码有效:

__ init __。py:

import os
filepath = os.path.join(os.path.dirname(os.path.realpath(__file__)), "abc.data")
with open(filepath, 'r') as f:
    pass # read and process the data

但是该解决方案有点脏,尤其是当要在__init__.py中读取许多文件时。有更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我认为这是最好的。甚至更大的库也使用相同的方法:

payload == null

另一个例子:

# Extracted From selenium/webdriver/firefox/firefox_profile.py

# ...
if not FirefoxProfile.DEFAULT_PREFERENCES:
            with open(os.path.join(os.path.dirname(__file__),
                                   WEBDRIVER_PREFERENCES)) as default_prefs:
                FirefoxProfile.DEFAULT_PREFERENCES = json.load(default_prefs)
# ...

如果它是可导入的对象(例如# Extracted from pipenv/vendor/yaspin/spinners.py # ... THIS_DIR = os.path.dirname(os.path.realpath(__file__)) SPINNERS_PATH = os.path.join(THIS_DIR, "data/spinners.json") # ... 文件),则可以使用.py约定来表示相对路径。