【相对路径】的坑:「当前文件路径」跟「当前工作路径」的区别 os.path.abspath() vs os.getcwd()

结论:

    我们代码中的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、

python慎用os.getcwd() ,除非你知道【文件路径与当前工作路径的区别】 -

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值