85

假设您有一个模块,其中包含

myfile = open('test.txt', 'r')

并且“test.txt”文件在同一个文件夹中。如果您将运行该模块,则该文件将成功打开。

现在,假设您从另一个文件夹中的另一个模块导入该模块。不会在与该代码所在的模块相同的文件夹中搜索该文件。

那么如何让模块在同一个文件夹中先搜索具有相对路径的文件呢?

__file__使用“ ”或“ ”有多种解决方案os.getcwd(),但我希望有一种更简洁的方法,例如传递给 open() 或 file() 的字符串中的相同特殊字符。

4

2 回答 2

102

解决方案是使用__file__,它非常干净:

import os

TEST_FILENAME = os.path.join(os.path.dirname(__file__), 'test.txt')
于 2012-04-16T13:04:00.200 回答
41

.py对于从文件加载的普通模块,__file__应该存在且可用。要将信息从__file__您的相对路径加入,有一个比os.path2014 年以来可用的接口更新的选项:

from pathlib import Path

here = Path(__file__).parent
fname = here / "test.txt"
with fname.open() as f:
    ...

pathlib在 3.4 中添加到 Python - 请参阅PEP428。对于仍使用 Python 2.7 并希望使用相同 API 的用户,可以使用反向移植

请注意,当您使用 Python 包时,有更好的方法可用于读取资源 - 您可以考虑迁移到importlib-resources。这需要 Python 3.7+,对于旧版本,您可以使用pkgutil. 正确打包资源而不是加入相对于源树的数据文件的一个优点是,代码在没有提取到文件系统(例如 zip 文件中的包)的情况下仍然可以工作。请参阅如何从 Python 包中读取(静态)文件?有关在包中读取/写入数据文件的更多详细信息。

于 2018-09-10T23:07:55.643 回答