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

Posted

技术标签:

【中文标题】open() 给出 FileNotFoundError/IOError: Errno 2 No such file or directory【英文标题】:open() gives FileNotFoundError/IOError: Errno 2 No such file or directory 【发布时间】:2012-08-25 11:30:41 【问题描述】:

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

这是代码:

file1 = open('recentlyUpdated.yaml')

错误是:

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

【问题讨论】:

确保您可以在文件资源管理器中看到所有文件扩展名...正如我所学的那样。 使用 PyCharm? ============= 将.csv文件所在的文件夹标记为“源根” -> 右键单击​​该文件夹并“将目录标记为”并选择“源根”。此外,检查运行/调试配置中的工作目录 -> 运行菜单 -> 编辑配置 -> 在左侧窗格中选择 Python 文件 -> 确保工作目录是您项目的根文件夹 [jetbrains.com/help/pycharm/… [1]: @ 987654322@ 对我来说,问题是我的文件是符号链接的。将文件夹复制到另一台计算机后,如果数据不存在,则基础数据丢失。这教会了我始终检查终端发生了什么。 【参考方案1】: 确保文件存在:使用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

【讨论】:

+1 用于 os.listdir() 建议。这是您在键盘上打脸的时刻之一,但如果在 Windows 10 上工作,请确保您没有在已有文件扩展名的地方手动添加文件扩展名。 Windows 中的默认视图通常隐藏扩展名,如果您犯了这个错误,它可能看起来像“fileName.txt”,其中名称实际上是“fileName.txt.txt”。要验证,请仔细查看 os.listdir() 的输出。此文件名不匹配还会给您“[Errno 2] 没有这样的文件或目录:”错误。我知道我知道。我的额头上还有空格键的印记。 在 linux 上,~/ 之类的主目录路径也不起作用。所以你需要使用/home/user/temp/file.txt 而不是~/temp/file.txt @Radek 是的,~shell 中的简写,而不是文件系统。如果要 Python 扩展它,请使用 os.path.expanduser()pathlib.Path.expanduser()【参考方案2】:

很可能,问题在于您使用relative file path 打开文件,但current working directory 未设置为您认为的那样。

相对路径是相对于 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()

(另见:How do I get the path and name of the file that is currently executing?)

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

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!

为避免犯此错误,请记住使用raw string literals 作为文件路径:

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

(另见:Windows path in Python)

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

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

【讨论】:

【参考方案3】:

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

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

试试这样:

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

【讨论】:

它似乎无法识别我计算机上的任何文件路径。有什么办法可以搜索文件吗? @sshekar【参考方案4】:

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

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

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

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

【讨论】:

【参考方案5】:

如果是 VSCode,请查看工作区。如果您在其他工作区,此错误可能会上升

【讨论】:

谢谢!需要打开一个新文件夹,擎天柱!【参考方案6】:

检查已经提到的路径,是绝对的还是相对的。

如果类似-->/folder/subfolder/file-->计算机将在根目录中搜索文件夹。

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

【讨论】:

以上是关于open() 给出 FileNotFoundError/IOError: Errno 2 No such file or directory的主要内容,如果未能解决你的问题,请参考以下文章

Rails 中的 Spreadsheet.open 给出此错误“未知编码名称 - MACINTOSH”

oracle cursor open-for-using给出错误的结果

Oracle Open Cursor for Using 给出错误 ORA-00932:不一致的数据类型

[Usaco2003 Open]Lost Cows

在JSP页面中 怎样实现点击按钮弹出选择框。能给出代码吗??

文件操作基础知识