为啥 os.path 指的是项目路径而不是文件路径?

Posted

技术标签:

【中文标题】为啥 os.path 指的是项目路径而不是文件路径?【英文标题】:Why does os.path refer to the project path instead of file path?为什么 os.path 指的是项目路径而不是文件路径? 【发布时间】:2020-04-22 01:03:04 【问题描述】:

这是文件夹的结构:

- python
  - python study
    - study.py
    - a.txt

study.py中的代码是:

import os

if(os.path.exists("a.txt")):
  print("YES") # my real code is not this
else:
  print("NO")

通常我将python study文件夹作为pycharm项目打开,像这样:

结果是YES

但是今天我不小心将python文件夹(不是python study)作为pycharm项目打开并运行代码。 结果是NO。最后,我发现它引用了python(项目路径)而不是.py文件的文件夹。这是什么目的?

之后,我在cmd中运行这段代码,结果是YES。 我认为在与其他人一起开发项目时会带来一些问题。(如果有人使用记事本而不是pycharm来编辑代码并在cmd中运行代码)。

【问题讨论】:

我认为这不是问题。您确实需要知道您在哪个文件夹中工作,否则可能会出现比脚本未运行更大的问题:) os.path.exist("a.txt") 将检查该文件是否存在于脚本运行的当前文件夹中。 ***.com/questions/786376/…的可能重复 @marxmacher 好的,这是真的。 【参考方案1】:

当您不指定文件的绝对路径时,假定它位于工作目录中。

当您从文件夹python(即工作目录)打开项目时,os.path.exists('a.txt') 实际上是在文件夹python 中查找文件“a.txt”。

为了使您的脚本独立于工作目录。您应该使用相对路径。

您可以使用__file__ 来引用您的脚本。您可以使用os.path.dirname 获取脚本的目录。

所以我认为您应该将代码修改为

import os

fname = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'a.txt')

if(os.path.exists(fname)):
  print("YES")
else:
  print("NO")

【讨论】:

实际上最好使用os.path.abspath(__file__),因为__file__并不总是绝对路径。 使用 __file__ 在Jupyter notebook as noted here with an alternate solution that's more universal 中不起作用【参考方案2】:

编辑:试试这个而不是简单地调用路径存在,因为它应该规范化路径名路径的绝对版本:

os.path.abspath(os.curdir)

顺便说一下,根据this,如果未授予对请求的文件执行 os.stat() 的权限,即使路径物理存在,此函数也可能返回 False。所以请记住这一点。

【讨论】:

这与所描述的问题无关 发布 cmets 作为答案不会让您获得需要评论的声誉。 @MadPhysicist 好的,感谢您的提醒。我编辑了我的答案......不会再发生了:)

以上是关于为啥 os.path 指的是项目路径而不是文件路径?的主要内容,如果未能解决你的问题,请参考以下文章

BASE_DIR 返回设置路径而不是项目路径(django 1.10)

python3中的os.path模块

python获取当前路径

Python OS路径

python文件路径读取方法整理(path)

python找文件存放路径为啥和真实存储路径不一样