提问人:Santiago 提问时间:8/31/2012 最后编辑:Karl KnechtelSantiago 更新时间:9/23/2023 访问量:773424
open() 给出 FileNotFoundError / IOError: '[Errno 2] 没有这样的文件或目录'
open() gives FileNotFoundError / IOError: '[Errno 2] No such file or directory'
问:
我正在尝试从我的 Python 脚本中打开文件。但是当我尝试使用:recentlyUpdated.yaml
open('recentlyUpdated.yaml')
我收到一个错误,上面写着:
IOError: [Errno 2] No such file or directory: 'recentlyUpdated.yaml'
为什么?我该如何解决该问题?
答:
- 确保文件存在(并且具有正确的文件扩展名):用于查看当前工作目录中的文件列表。
os.listdir()
- 确保您位于预期目录中,使用 。
(如果从 IDE 启动代码,则可能位于其他目录中。os.getcwd()
- 然后,您可以:
- 调用 where 是包含文件的目录。然后,仅使用其名称打开文件,例如 .
os.chdir(dir)
dir
open("file.txt")
- 指定调用中文件的绝对路径。
open
- 调用 where 是包含文件的目录。然后,仅使用其名称打开文件,例如 .
- 如果您的路径使用反斜杠,请使用原始字符串 (),例如
所以:
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.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') # absolute path
评论
~/
/home/user/temp/file.txt
~/temp/file.txt
os.path.expanduser()
或 pathlib。路径.expanduser()。
~
os.chdir
更改程序的全局状态,并可能在脚本的其他部分引入错误。我不建议这样做。
该文件可能已存在,但可能具有不同的路径。尝试编写文件的绝对路径。
try 函数检查至少 python 是否看到该文件。os.listdir()
试试这个:
file1 = open(r'Drive:\Dir\recentlyUpdated.yaml')
评论
最有可能的是,问题在于您正在使用相对文件路径来打开文件,但当前工作目录未设置为您认为的目录。
一个常见的误解是,相对路径相对于 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
您可能关闭了“file1”。
只需使用“w”标志,即可创建新文件:
file1 = open('recentlyUpdated.yaml', 'w')
mode 是一个可选字符串,用于指定文件所处的模式 已打开。它默认为“r”,表示打开以阅读文本 模式。其他常用值是“w”表示写入(如果截断文件 它已经存在)......
(另见 https://docs.python.org/3/library/functions.html?highlight=open#open)
如果是 VSCode,请参阅工作区。如果您在其他工作区中,则此错误可能会上升
检查已提及的路径,如果它是绝对路径还是相对路径。
如果是这样的-->-->Computer将在根目录中搜索文件夹。/folder/subfolder/file
如果是类似-->-->计算机将在当前工作目录中搜索文件夹。./folder/subfolder/file
了解绝对路径和相对路径
“路径”一词的意思正是它听起来的样子。它显示了查找文件需要执行的步骤,进入和离开文件夹。路径上的每个步骤要么是文件夹名称,要么是特殊名称(表示当前文件夹),要么是特殊名称(表示返回/退出父文件夹)。.
..
术语“绝对”和“相对”也有其通常的英语含义。相对路径显示某物相对于某个起点的位置;绝对路径是从顶部开始的位置。
以路径分隔符或驱动器号后跟路径分隔符(如 )开头的路径是绝对的。(在 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.txt
name
在相对路径中错误计算 s 或不恰当地重复路径中的文件夹名称也很常见。以编程方式构造路径时要特别小心。最后,请记住,当已经在根目录中(在 Linux 或 Mac 上,或在 Windows 上的驱动器根目录)中时,这将不起作用。
..
..
/
在基于用户输入构建路径时,要更加小心。如果输入未经清理,可能会发生不好的事情(例如,允许用户将文件解压缩到一个文件夹中,在那里它会覆盖一些重要的东西,或者不应该允许用户写入文件)。
另一个常见的问题是,当前用户主目录的特殊快捷方式在 Python 程序中指定的绝对路径中不起作用。必须使用 显式将路径的该部分转换为实际路径。请参阅为什么我在 python 中被迫使用 os.path.expanduser? 并且 os.makedirs 不理解我路径中的“~”。
~
os.path.expanduser
请记住,这将仅提供文件名,而不会提供路径。仅当该目录是当前工作目录时,尝试循环访问以这种方式列出的目录才有效。
os.listdir
确保实际文件名也很重要。Windows 可以选择在 GUI 中隐藏文件扩展名。如果您在窗口中看到,则可能是文件的实际名称是 ,或者其他名称。您可以在设置中禁用此选项。您还可以使用命令行验证文件名; 会告诉你文件夹中内容的真相。(当然,Linux/Mac的等价物是,但问题一开始就不应该出现。
foo.txt
foo.txt.txt
dir
ls
普通字符串中的反斜杠是转义序列。当尝试在 Windows 上使用反斜杠作为路径分隔符时,这会导致问题。但是,为此使用反斜杠不是必需的,通常也不建议这样做。请参阅我应该如何在 Python 字符串文字中编写 Windows 路径?。
当尝试使用文件模式创建新文件时,例如 ,新文件的路径仍需要存在 - 即所有中间文件夹。例如,请参阅尝试使用 open(filename, 'w' ) 给出 IOError: [Errno 2] 如果目录不存在,则没有这样的文件或目录。另请记住,新文件名必须有效。特别是,尝试在文件名中插入格式的日期是行不通的,因为 s 将被视为路径分隔符。
w
MM/DD/YYYY
/
如果您使用的是像 VScode 这样的 IDE,请确保您已从保存要访问的文件的同一目录中打开了 IDE。
例如,如果要访问文档中的文件.txt,请尝试通过右键单击目录并单击“打开方式”从文档打开 IDE
(适用于 Pycharm)
Pycharm 具有内置的“Active Directory”设置
更改文件夹名称时可能会收到此错误,因为此设置未更新。要在 Pycharm 中修复此错误,请选择“编辑配置”(窗口右上角的“运行”按钮旁边)。
然后更改脚本路径(以防万一)和工作目录文件夹。
确保文件路径中的所有文件夹都存在。
我收到此错误是因为它是否正在创建文件夹对我来说并不明显,因为从理论上讲,代码中调用的函数应该这样做。
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 的情况下,他只是读取文件,因此它应该存在于他提供的路径中。我们忘记打开函数的标志(例如)并最终得到此错误可能是很常见的。w
open('/path/to/file', 'w')
一种(多种)可能的故障情况:
- 如果目标文件是一个符号链接,并且您获得了引用,例如通过 os.scandir(
)、os.listdir(
)
等,然后尝试在损坏的符号链接上调用.stat(),
那么将尝试对不存在的符号链接目标进行调用,而不是符号链接本身。stat()
默认情况下,使用 .stat(*, follow_symlinks=True)
调用;用于防止以下(损坏的)符号链接。.stat()
.stat(follow_symlinks=False)
评论