【问题标题】:Python os.listdir() behaving strangely, need some explanationPython os.listdir() 行为异常,需要一些解释
【发布时间】:2016-10-20 17:15:52
【问题描述】:

我正在使用 python,在 PyCharm IDE (windows 10) 上使用 Anaconda,并使用虚拟环境。这是我有问题的代码,

print('# File...')
print(os.listdir("../MyData/Data/"))

当我在控制台中运行代码时(右键单击然后“在控制台中执行部分”),它运行良好。但是,当我运行整个代码(从绿色按钮开始)时,它显示 FileNotFoundError: [WinError 3] The system cannot find the path specified: '../MyData/Data/'

有人可以解释为什么会发生这种情况,以及可能的方向吗?谢谢。

【问题讨论】:

  • 听起来../MyData/Data 不存在。确保您位于您认为与os.getcwd() 在一起的文件夹中。
  • 使用完整路径而不是 up.full/path/here 而不是 ../partial/path
  • 列出数据相对于脚本的位置可能更容易...os.listdir(os.path.join(os.path.basename(__file__), os.pardir, 'MyData', 'Data'))
  • 区别在于你的“当前工作目录”。当您从控制台运行时,它是您启动程序时所在的目录。当您在 IDE 中时,它可能是 IDE 的安装目录。
  • 那是相对路径。问题是相对于什么。它相对于当前工作目录。那是什么? print(os.getcwd())

标签: python pycharm virtualenv


【解决方案1】:

小心, Windows 通常在地址中有"\"。 这很简单,但可能是个大问题。 由于"\" 被用作转义,您将不得不使用"\\"。 试试这个测试,看看地址是否正确:

import os
print(os.getcwd())

它将打印您当前的工作目录

【讨论】:

  • Windows API 从一开始就能够在路径名中互换使用/ 和``。
  • 谢谢。正如我上面提到的,这帮助我缩小了案例范围。
【解决方案2】:

所有程序都有一个工作目录,由启动它的代码决定。当您右键单击并在控制台中运行时,控制台作为其初始化过程的一部分,专门将当前工作目录设置为您的主目录。当您在 gui 中运行时,会发生什么取决于启动程序的窗口管理器。我认为 Microsoft Windows 喜欢将 CWD 设置为可执行文件的目录,但我不确定。

解决方法是在程序启动时手动设置当前目录。

import os
os.chdir(os.path.expanduser('~'))

您可以在 gui 和控制台案例中执行此操作。此代码运行后,相对路径将相对于您的主目录。

【讨论】:

  • 如果我想反过来怎么办?我不希望程序在我的家/$HOME/~ 目录中启动。我希望它从它所在的位置开始,它所在的目录。即使我从 Windows 启动(通过搜索或其他方式)启动它。删除打开文件路径并从文件资源管理器启动它的必要步骤。
  • @Brambor 正在执行的脚本在sys.argv[0] 中,所以os.path.dirname(sys.argv[0]) 得到它的目录。您还可以使用模块的 __file__ 属性来告诉您导入的模块来自哪里。
  • 哦,是的,我前段时间解决了。我使用了path_to_DnD = sys.path[0],它指向我的文件DnD.py 所在的位置。然后我将所有路径格式化为绝对路径:我使用"%s/tests" % path_to_DnD 而不是"tests" 来指向文件。 DnD.py 文件是我从 Windows 开始执行的文件。
【解决方案3】:

你应该使用如下的完整路径:

os.listdir ("C:\Users\YourUsername\Full\Path")

【讨论】:

  • "Tom" 不起作用,不是很明显吗? :) 但是,完整路径选项有效。但是,我的询问是,为什么它不起作用,以及我(任何人)应该知道什么来修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多