open() 给出 FileNotFoundError / IOError: '[Errno 2] 没有这样的文件或目录'

open() gives FileNotFoundError / IOError: '[Errno 2] No such file or directory'

提问人:Santiago 提问时间:8/31/2012 最后编辑:Karl KnechtelSantiago 更新时间:9/23/2023 访问量:773424

问:

我正在尝试从我的 Python 脚本中打开文件。但是当我尝试使用:recentlyUpdated.yaml

open('recentlyUpdated.yaml')

我收到一个错误,上面写着:

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

为什么?我该如何解决该问题?

python 文件-io 路径 文件未找到

评论

1赞 Xetrov 7/1/2020
确保您可以在文件资源管理器中看到所有文件扩展名...正如我所学到的艰难的方式。
1赞 Hassan Naqvi 9/5/2020
使用 PyCharm?============= 将.csv文件所在的文件夹标记为“源根”->右键单击该文件夹并“将目录标记为”,然后选择“源根”。另外,检查运行/调试配置中的工作目录 -> 运行菜单 -> 编辑配置 -> 在左窗格中选择 Python 文件 -> 确保工作目录是项目的根文件夹 [jetbrains.com/help/pycharm/...[1]:jetbrains.com/help/pycharm/......
0赞 scottlittle 8/15/2021
对我来说,问题是我的文件是符号链接的。如果数据不存在,则将文件夹复制到另一台计算机后,基础数据丢失。这教会了我始终在终端中检查发生了什么。
3赞 tripleee 4/10/2022
参见 当前工作目录到底是什么?

答:

159赞 Lanaru 8/31/2012 #1
  • 确保文件存在(并且具有正确的文件扩展名):用于查看当前工作目录中的文件列表。os.listdir()
  • 确保您位于预期目录中,使用 。
    (如果从 IDE 启动代码,则可能位于其他目录中。
    os.getcwd()
  • 然后,您可以:
    • 调用 where 是包含文件的目录。然后,仅使用其名称打开文件,例如 .os.chdir(dir)diropen("file.txt")
    • 指定调用中文件的绝对路径。open
  • 如果您的路径使用反斜杠,请使用原始字符串 (),例如 所以:r""dir = r'C:\Python32'
    • 如果你不使用原始字符串,你必须转义每个反斜杠:'C:\\User\\Bob\\...'
    • 正斜杠也适用于 Windows,不需要转义。'C:/Python32'

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

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

如果你尝试这样做,Python 会看到你正在向它传递一个相对路径,因此它将在当前工作目录中搜索文件。open('sortedLists.yaml')

调用将更改当前工作目录。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

评论

3赞 Radek Daniluk 1/8/2020
在 linux 上,主目录路径也不起作用。所以你需要用 代替 .~//home/user/temp/file.txt~/temp/file.txt
0赞 wjandrea 1/17/2022
@Radek是的,是 shell 中的简写,而不是文件系统。如果你想让 Python 扩展它,请使用 os.path.expanduser()pathlib。路径.expanduser()。~
0赞 Matthias 7/19/2023
os.chdir更改程序的全局状态,并可能在脚本的其他部分引入错误。我不建议这样做。
7赞 heretolearn 8/31/2012 #2

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

try 函数检查至少 python 是否看到该文件。os.listdir()

试试这个:

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

评论

1赞 Santiago 8/31/2012
它似乎无法识别我计算机上的任何文件路径。有什么方法可以搜索文件吗?@sshekar
36赞 Aran-Fey 9/9/2018 #3

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

一个常见的误解是,相对路径相对于 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.yamlfile.yaml.yaml

3赞 Kassi 8/15/2019 #4

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

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

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

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

2赞 zzfima 5/28/2020 #5

如果是 VSCode,请参阅工作区。如果您在其他工作区中,则此错误可能会上升

0赞 Vortex 7/4/2021 #6

检查已提及的路径,如果它是绝对路径还是相对路径。

如果是这样的-->-->Computer将在根目录中搜索文件夹。/folder/subfolder/file

如果是类似-->-->计算机将在当前工作目录中搜索文件夹。./folder/subfolder/file

3赞 Karl Knechtel 9/4/2022 #7

了解绝对路径和相对路径

“路径”一词的意思正是它听起来的样子。它显示了查找文件需要执行的步骤,进入和离开文件夹。路径上的每个步骤要么是文件夹名称,要么是特殊名称(表示当前文件夹),要么是特殊名称(表示返回/退出父文件夹)。...

术语“绝对”和“相对”也有其通常的英语含义。相对路径显示某物相对于某个起点的位置;绝对路径是从顶部开始的位置。

以路径分隔符或驱动器号后跟路径分隔符(如 )开头的路径是绝对的。(在 Windows 上,还有 UNC 路径,这些路径必然是绝对的。大多数人永远不必担心这些。C:/foo

直接以文件或文件夹名称开头的路径,或者以驱动器号直接后跟文件或文件夹名称(如 )开头的路径是相对的。C:foo

了解“当前工作目录”

相对路径是“相对于”所谓的当前工作目录(以下简称CWD)。在命令行中,Linux 和 Mac 在所有驱动器上使用通用 CWD。(整个文件系统有一个通用的“根”,可能包括多个物理存储设备。Windows 略有不同:它会记住每个驱动器的最新 CWD,并具有在驱动器之间切换的单独功能,从而恢复那些旧的 CWD 值。

每个进程(包括终端/命令窗口)都有自己的 CWD。当程序从命令行启动时,它将获取终端/命令进程正在使用的 CWD。当从 GUI 启动程序时(通过双击脚本,或将某些内容拖到脚本上,或将脚本拖动到 Python 可执行文件上)或使用 IDE,CWD 可能是任意数量的东西,具体取决于详细信息。

重要的是,CWD 不一定是脚本所在的位置。

可以使用 os.getcdd 检查脚本的 CWD,并使用 os.chdir 进行修改。每个 IDE 都有自己的规则来控制初始 CWD;有关详细信息,请查看文档。

若要将 CWD 设置为包含当前脚本的文件夹,请确定该路径,然后进行设置:

os.chdir(os.path.dirname(os.path.abspath(__file__)))

验证实际文件名和路径

  • 文件路径可能与预期不符的原因有很多。例如,有时人们希望 Windows 上的 C:/foo.txt 表示“桌面上名为 foo.txt 的文件”。这是错误的。该文件实际上 - 通常 - at (替换为当前用户的用户名)。相反,如果 Windows 配置为将其放在其他位置,则它可能位于其他位置。若要以可移植方式查找桌面的路径,请参阅如何获取桌面位置?C:/Users/name/Desktop/foo.txtname

    在相对路径中错误计算 s 或不恰当地重复路径中的文件夹名称也很常见。以编程方式构造路径时要特别小心。最后,请记住,当已经在根目录中(在 Linux 或 Mac 上,或在 Windows 上的驱动器根目录)中时,这将不起作用。..../

    在基于用户输入构建路径时,要更加小心。如果输入未经清理,可能会发生不好的事情(例如,允许用户将文件解压缩到一个文件夹中,在那里它会覆盖一些重要的东西,或者不应该允许用户写入文件)。

  • 另一个常见的问题是,当前用户主目录的特殊快捷方式在 Python 程序中指定的绝对路径中不起作用。必须使用 显式将路径的该部分转换为实际路径。请参阅为什么我在 python 中被迫使用 os.path.expanduser? 并且 os.makedirs 不理解我路径中的“~”。~os.path.expanduser

  • 请记住,这将提供文件名,而不会提供路径。仅当该目录是当前工作目录时,尝试循环访问以这种方式列出的目录才有效。os.listdir

  • 确保实际文件名也很重要。Windows 可以选择在 GUI 中隐藏文件扩展名。如果您在窗口中看到,则可能是文件的实际名称是 ,或者其他名称。您可以在设置中禁用此选项。您还可以使用命令行验证文件名; 会告诉你文件夹中内容的真相。(当然,Linux/Mac的等价物是,但问题一开始就不应该出现。foo.txtfoo.txt.txtdirls

  • 普通字符串中的反斜杠是转义序列。当尝试在 Windows 上使用反斜杠作为路径分隔符时,这会导致问题。但是,为此使用反斜杠不是必需的,通常也不建议这样做。请参阅我应该如何在 Python 字符串文字中编写 Windows 路径?

  • 当尝试使用文件模式创建新文件时,例如 ,文件的路径仍需要存在 - 即所有中间文件夹。例如,请参阅尝试使用 open(filename, 'w' ) 给出 IOError: [Errno 2] 如果目录不存在,则没有这样的文件或目录。另请记住,新文件名必须有效。特别是,尝试在文件名中插入格式的日期是行不通的,因为 s 将被视为路径分隔符。wMM/DD/YYYY/

0赞 Sinjini 10/25/2022 #8

如果您使用的是像 VScode 这样的 IDE,请确保您已从保存要访问的文件的同一目录中打开了 IDE。

例如,如果要访问文档中的文件.txt,请尝试通过右键单击目录并单击“打开方式”从文档打开 IDE

0赞 Blue Robin 6/23/2023 #9

(适用于 Pycharm)

Pycharm 具有内置的“Active Directory”设置

更改文件夹名称时可能会收到此错误,因为此设置未更新。要在 Pycharm 中修复此错误,请选择“编辑配置”(窗口右上角的“运行”按钮旁边)。

Picture of "Edit Configurations"

然后更改脚本路径(以防万一)和工作目录文件夹。

enter image description here

1赞 Maicon Mauricio 8/16/2023 #10

确保文件路径中的所有文件夹都存在。

我收到此错误是因为它是否正在创建文件夹对我来说并不明显,因为从理论上讲,代码中调用的函数应该这样做。

import os

file_path = input('Input file path')
dir_path = os.path.dirname(file_path)

os.makedirs(dir_path, exist_ok=True)

with open(file_path) as file:
    file.write("Written!")

在 OP 的情况下,他只是读取文件,因此它应该存在于他提供的路径中。我们忘记打开函数的标志(例如)并最终得到此错误可能是很常见的。wopen('/path/to/file', 'w')

0赞 ccpizza 9/23/2023 #11

一种(多种)可能的故障情况:

  • 如果目标文件是一个符号链接,并且您获得了引用,例如通过 os.scandir()、os.listdir( 等,然后尝试在损坏的符号链接上调用 .stat(),那么将尝试对不存在的符号链接目标进行调用,而不是符号链接本身。stat()

默认情况下,使用 .stat(*, follow_symlinks=True) 调用;用于防止以下(损坏的)符号链接。.stat().stat(follow_symlinks=False)