Python open()提供FileNotFoundError / IOError:Errno 2没有这样的文件或目录


80

由于某些原因,我的代码无法打开简单的文件:

这是代码:

file1 = open('recentlyUpdated.yaml')

错误是:

IOError: [Errno 2] No such file or directory: 'recentlyUpdated.yaml'
  • 自然地,我检查了这是文件的正确名称。
  • 我尝试在文件中四处移动,提供文件open()的完整路径,但似乎都不起作用。

确保您可以在“文件资源管理器”中看到所有文件扩展名。
VortexYT

使用PyCharm?==============将.csv文件所在的文件夹标记为“源根目录”->右键单击该文件夹,然后“将目录标记为”,然后选择“源根目录”。另外,在运行/调试配置->运行菜单->编辑配置->在左窗格中选择Python文件->确保工作目录是项目的根文件夹[ jetbrains.com/help/pycharm/ ... [1]:jetbrains.com/help/pycharm/...
哈桑纳克维

Answers:


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

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

  • 一个绝对路径是启动您的计算机的根目录下,例如路径“C:\ Python的\脚本..”,如果你使用的是Windows。
  • 一个相对路径是不与您的计算机的根目录开始的路径,而是相对于一些所谓的是working directory。您可以通过调用查看Python的当前工作目录os.getcwd()

如果您尝试这样做open('sortedLists.yaml'),Python将看到您正在向其传递相对路径,因此它将在当前工作目录中搜索文件。调用os.chdir将更改当前的工作目录。

范例:假设在file.txt中找到C:\Folder

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

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

要么

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

使用os.chdir(dir)时,是否必须将路径放置到目录中,还是仅放置目录名?另外,一旦获得文件名,是否将其放入open()或编写open(os.chdir(dir))?
圣地亚哥

@圣地亚哥我在回答中对此做了澄清。
拉纳鲁(Lanaru)2012年

3
+1为原始字符串r''
WKordos

您可以使用相同的技术来打开任何文件类型。但是,您将必须'b'在open函数中传递第二个参数a ,以指定您将文件读取为二进制数据。
拉纳鲁2014年

3
为os.listdir()建议+1。这是让您在键盘按键上不敢恭维的一件事,但是,如果在Windows 10上运行,请确保没有在现有扩展名中手动添加文件扩展名。Windows中的默认视图通常会隐藏扩展名,如果您犯了此错误,则它看起来可能像“ fileName.txt”,其中名称实际上是“ fileName.txt.txt”。要进行验证,请仔细查看os.listdir()的输出。此文件名不匹配还会导致出现“ [Errno 2] No such file or directory:”错误。我知道我知道。我的额头上仍然有空格键的印记。
DCaugs

13

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

人们普遍误解为相对路径是相对于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。仔细检查文件的扩展名。


6

该文件可能存在,但路径可能不同。尝试编写文件的绝对路径。

尝试使用os.listdir()函数来检查至少Python是否能看到该文件。

像这样尝试:

file1 = open(r'Drive:\Dir\recentlyUpdated.yaml')

1
它似乎无法识别我计算机上的任何文件路径。有什么办法可以搜索文件?@sshekar
圣地亚哥

2

可能是您关闭了“ file1”。
只需使用“ w”标志,即创建新文件:

file1 = open('recentlyUpdated.yaml', 'w')

mode是一个可选字符串,用于指定打开文件的模式。默认为“ r”,这意味着可以在文本模式下阅读。其他常用值是用于写入的“ w”(如果文件已经存在,则将其截断)...

(另请参见https://docs.python.org/3/library/functions.html?highlight=open#open


1

如果是VSCode,请参见工作区。如果您在其他工作空间中,则可能会出现此错误


谢谢!需要打开一个新文件夹Optimus Prime!
m4n0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.