open() 给出 FileNotFoundError/IOError: Errno 2 No such file or directory

新手上路,请多包涵

出于某种原因,我的代码无法打开一个简单的文件:

这是代码:

 file1 = open('recentlyUpdated.yaml')

错误是:

 IOError: [Errno 2] No such file or directory: 'recentlyUpdated.yaml'

  • 当然,我检查了这是文件的正确名称。
  • 我试过移动文件,给 open() 文件的完整路径,但似乎都不起作用。

原文由 Santiago 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答
  • 确保文件存在:使用 os.listdir() 查看当前工作目录中的文件列表
  • 确保您位于您认为您所在的目录中 os.getcwd() (如果您从 IDE 启动代码,您很可能在不同的目录中)
  • 然后,您可以:
    • 调用 os.chdir(dir)dir 是文件所在的文件夹,然后像以前一样用文件名打开文件。
    • 在您的 open 调用中指定文件的绝对路径。
  • 如果您的路径使用反斜杠,请记住使用原始字符串,如下所示: dir = r'C:\Python32'
    • 如果您不使用原始字符串,则必须转义每个反斜杠: 'C:\\User\\Bob\\...'
    • 正斜杠也适用于 Windows 'C:/Python32' 并且不需要转义。

让我澄清一下 Python 是如何查找文件的:

  • 绝对路径 是以计算机的根目录开头的路径,例如 C:\Python\scripts 如果您使用的是 Windows。
  • 相对路径 是不以计算机的根目录开头的路径,而是相对于称为 工作目录 的东西的路径。您可以通过调用 os.getcwd() 查看 Python 的当前工作目录。

如果您尝试执行 open('sortedLists.yaml') ,Python 将看到您正在向其传递相对路径,因此它将在当前工作目录中搜索文件。

调用 os.chdir() 将更改当前工作目录。

示例:假设 file.txtC:\Folder 中找到。

要打开它,您可以执行以下操作:

 os.chdir(r'C:\Folder')
open('file.txt') # relative path, looks inside the current working directory

或者

open(r'C:\Folder\file.txt') # absolute path

原文由 Lanaru 发布,翻译遵循 CC BY-SA 4.0 许可协议

问题很可能是您使用 相对文件路径 打开文件,但 当前工作目录 未设置为您认为的目录。

认为相对路径是相对于 python 脚本的位置是一种常见的误解,但这是不正确的。相对文件路径总是相对于当前工作目录,当前工作目录不一定是 python 脚本的位置。

您有以下三种选择:

  • 使用绝对路径打开文件:
   file = open(r'C:\path\to\your\file.yaml')

  • 生成文件相对于 python 脚本的路径:
   from pathlib import Path

  script_location = Path(__file__).absolute().parent
  file_location = script_location / 'file.yaml'
  file = file_location.open()

(另请参阅: 如何获取当前正在执行的文件的路径和名称?

  • 在打开文件之前更改当前工作目录:
   import os

  os.chdir(r'C:\path\to\your\file')
  file = open('file.yaml')


其他可能导致“找不到文件”错误的常见错误包括:

  • 不小心在文件路径中使用了转义序列:
   path = 'C:\Users\newton\file.yaml'
  # Incorrect! The '\n' in 'Users\newton' is a line break character!

为避免犯此错误,请记住对文件路径使用 原始字符串文字

   path = r'C:\Users\newton\file.yaml'
  # Correct!

(另请参阅: Python 中的 Windows 路径

  • 忘记 Windows 不显示文件扩展名:

由于 Windows 不显示已知的文件扩展名,有时当您认为您的文件名为 file.yaml 时,它实际上被命名为 file.yaml.yaml 。仔细检查文件的扩展名。

原文由 Aran-Fey 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题