制作"始终相对于当前模块"的文件路径?

49 python module relative-path

假设你有一个包含的模块

myfile = open('test.txt', 'r')
Run Code Online (Sandbox Code Playgroud)

'test.txt'文件位于同一个文件夹中.如果您将运行该模块,该文件将成功打开.现在假设您从另一个文件夹中导入该模块.不会在与该代码所在的模块相同的文件夹中搜索该文件.那么如何让模块首先在同一个文件夹中搜索相对路径的文件呢?使用" __file__"或" os.getcwd()" 有各种解决方案,但我希望有一种更简洁的方法,就像传递给open()或file()的字符串中的相同特殊字符一样.

yak*_*yak 58

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

import os

TEST_FILENAME = os.path.join(os.path.dirname(__file__), 'test.txt')
Run Code Online (Sandbox Code Playgroud)


wim*_*wim 12

对于从.py文件加载的普通模块,__file__应该存在并且可用。为了将信息从__file__您的相对路径加入到您的相对路径中,os.path自2014年以来提供了比接口更新的选项:

from pathlib import Path

here = Path(__file__).parent
fname = here/'test.txt'
with fname.open() as f:
    ...
Run Code Online (Sandbox Code Playgroud)

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

有兴趣应用现有最现代方法的用户应考虑移至importlib-resources,而不是相对于源树加入数据文件。当前,很少有用户愿意将兼容性仅限制在Python 3.7+上,因此我谨此提起对那些喜欢前沿技术的人的注意。