结论:
我们代码中的path="./xx.txt"这种相对路径是相对于【当前工作路径】的相对路径。
但我们嘴上提“相对路径”时,心中通常想的是相对于【当前文件路径】的相对路径。
所以,一旦出现【当前工作路径 ≠ 当前文件路径】 时就容易踩坑了。
使用建议:
通过【当前文件路径 + 相对路径】转成绝对路径,更可靠。
path = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'xx.txt')
如果.py文件不是在项目文件夹的根目录,而是在项目文件夹的子目录,就容易踩这个坑。在vscode 或 pycharm 中,直接在代码窗口右键菜单“运行python-->在终端运行python文件”就要注意这个问题。留意终端上的【当前工作路径】是项目根目录,还是脚本文件所在目录。 一般需要手动输入 cd my_sub_dir 才会进入脚本所在目录的。
=========================>
为了让程序可以灵活地在不同机器上跑,我们经常使用【相对路径】来访问某些文件。
于是代码这样写:
with open(r'.\sent.txt', mode='r', ) as f:
content = f.read()
在不同环境下,有时候却发生莫名其妙的错,报:FileNotFoundError: [Errno 2] No such file or directory: '.\\sent.txt'
仔细回想细节差异,才发现:如果我 WIN+R 输入cmd 调出命令窗口,然后把程序拖放到窗口,回车执行,就报错。如果我直接双击exe运行则正常。
查了资料,才知到如果直接写‘.\sent.txt’ 时,是在【工作路径】下找这个文件。
而 工作路径 跟 文件路径 是不同的概念,如果sent.txt 放在 helloWorld.exe同一个目录下,那么就建议使用【os.path.abspath】来读取文件,即:
os.path.abspath(os.path.dirname(__file__))
那为什么不直接用:
os.path.dirname(__file__)
因为他们的斜杠方向不一样!
print(os.path.dirname(__file__))
# 得到 C:/pyproject/git/test 【左斜杠】
print(os.path.dirname(os.path.abspath(__file__)))
# 得到 C:\pyproject\git\test 【反斜杠】
总结一下:
「当前文件路径」用 os.path.abspath(os.path.dirname(__file__))
「当前工作路径」用 os.path.abspath(os.path.dirname(os.getcwd()))
with open(r'.\sent.txt', mode='r', ) as f:
content = f.read()
# 改为:
with open(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'sent.txt'), mode='r', ) as f:
content = f.read()
参考:
1、
os.path.dirname(__file__)、os.path.abspath(__file__)、os.path.join()使用_peiwang245的博客-CSDN博客
2、