open() 给出 FileNotFoundError / IOError: '[Errno 2] 没有这样的文件或目录'
- 2024-11-20 08:44:00
- admin 原创
- 11
问题描述:
我正在尝试从我的 Python 脚本打开该文件recentlyUpdated.yaml
。但是当我尝试使用:
open('recentlyUpdated.yaml')
我收到一条错误消息:
IOError: [Errno 2] No such file or directory: 'recentlyUpdated.yaml'
为什么?我该如何解决这个问题?
解决方案 1:
让我解释一下Python如何查找文件:
绝对路径是从计算机根目录开始的路径,例如
C:Pythonscripts
如果您使用的是 Windows。相对路径不是从计算机的根目录开始的路径,而是相对于所谓的工作目录的路径。
如果您尝试执行此操作open('recentlyUpdated.yaml')
,Python 将看到您传递了一个相对路径,因此它将在当前工作目录中搜索该文件。
诊断问题:
确保文件存在(并且具有正确的文件扩展名):用于
os.listdir()
查看当前工作目录中的文件列表。使用 确保您位于预期目录中
os.getcwd()
。
(如果您从 IDE 启动代码,则可能会位于不同的目录中。)
然后您可以:
调用
os.chdir(dir)
包含dir
该文件的目录。这将更改当前工作目录。然后,仅使用其名称打开该文件,例如open("file.txt")
。在您的调用中指定文件的绝对路径
open
。
顺便一提:
如果路径使用反斜杠,请使用原始字符串( ),如下所示:
r""
`dir = r'C:Python32'`如果不使用原始字符串,则必须转义每个反斜杠:
'C:\User\Bob\...'
正斜杠在 Windows 上也能用
'C:/Python32'
,不需要转义。
例如:假设file.txt
在 中找到C:Folder
。
要打开它,你可以执行以下操作:
os.chdir(r'C:Folder')
open('file.txt') # relative path, looks inside the current working directory
或者
open(r'C:Folderile.txt') # absolute path
解决方案 2:
最有可能的是,问题在于您使用相对文件路径打开文件,但当前工作目录未设置为您认为的那样。
一个常见的误解是相对路径是相对于 Python 脚本的位置,但事实并非如此。相对文件路径始终相对于当前工作目录,并且当前工作目录不一定是 Python 脚本的位置。
您有三个选择:
使用绝对路径打开文件:
file = open(r'C:path oyourile.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 oyourile')
file = open('file.yaml')
可能导致“找不到文件”错误的其他常见错误包括:
在文件路径中意外使用转义序列:
path = 'C:Users
ewtonile.yaml'
# Incorrect! The '
' in 'Users
ewton' is a line break character!
为了避免犯这个错误,请记住使用原始字符串文字作为文件路径:
path = r'C:Users
ewtonile.yaml'
# Correct!
(另请参阅:Python 中的 Windows 路径)
忘记 Windows 不显示文件扩展名:
由于 Windows 不显示已知文件扩展名,有时您认为文件名为file.yaml
,但实际上名为file.yaml.yaml
。请仔细检查文件的扩展名。
解决方案 3:
该文件可能存在,但路径可能不同。请尝试写入该文件的绝对路径。
尝试os.listdir()
函数检查至少 python 是否可以看到该文件。
尝试一下:
file1 = open(r'Drive:Dir
ecentlyUpdated.yaml')
解决方案 4:
如果是 VSCode,请查看工作区。如果你在其他工作区,可能会出现此错误
解决方案 5:
可能你关闭了 'file1'。
只需使用 'w' 标志,即可创建新文件:
file1 = open('recentlyUpdated.yaml', 'w')
mode是一个可选字符串,用于指定打开文件的模式。默认为 'r',表示以文本模式打开并读取。其他常见值包括 'w',表示写入(如果文件已存在,则截断文件)...
(另请参阅https://docs.python.org/3/library/functions.html?highlight=open#open)
解决方案 6:
了解绝对路径和相对路径
路径一词的含义与字面意思完全一致。它显示了需要采取的步骤,进入和退出文件夹以查找文件。路径上的每一步要么是文件夹名称,.
要么是特殊名称(表示当前文件夹),要么是特殊名称..
(表示返回/退出父文件夹)。
绝对和相对这两个术语也有其通常的英语含义。相对路径表示某物相对于某个起点的位置;绝对路径是从顶部开始的位置。
在 Windows 上,以路径分隔符开头的路径,或以驱动器号后跟路径分隔符的路径(如C:/foo
)都是绝对路径。(在 Windows 上,还有UNC 路径,它们必然是绝对路径。大多数人永远不必担心这些。)
C:foo
在 Windows 上,直接以文件或文件夹名称开头的路径,或者驱动器号后直接跟文件或文件夹名称(如)的路径是相对的。
理解“当前工作目录”
相对路径是“相对于”所谓的当前工作目录(以下简称 CWD)的。在命令行中,Linux 和 Mac 在所有驱动器上使用通用的 CWD。(整个文件系统有一个通用的“根”,并且可能包括多个物理存储设备。)Windows 略有不同:它会记住每个驱动器的最新 CWD,并且具有在驱动器之间切换的单独功能,从而恢复那些旧的 CWD 值。
每个进程(包括终端/命令窗口)都有自己的 CWD。当从命令行启动程序时,它将获取终端/命令进程正在使用的 CWD。当从 GUI(通过双击脚本、将某些内容拖到脚本上或将脚本拖到 Python 可执行文件上)或使用 IDE 启动程序时,CWD 可能是任意数量的,具体取决于详细信息。
重要的是,CWD不一定是脚本所在的位置。
可以使用 检查os.getcwd
脚本的 CWD ,并使用 进行修改os.chdir
。每个 IDE 都有自己的规则来控制初始 CWD;有关详细信息,请查看文档。
要将 CWD 设置为包含当前脚本的文件夹,请确定该路径,然后进行设置:
os.chdir(os.path.dirname(os.path.abspath(__file__)))
验证实际的文件名和路径
有很多原因会导致文件路径与预期不符。例如,有时人们期望
C:/foo.txt
Windows 上的 表示“foo.txt
桌面上命名的文件”。这是错误的。该文件实际上 -通常- 位于C:/Users/name/Desktop/foo.txt
(替换name
为当前用户的用户名)。如果 Windows 配置为将其放在其他地方,则它可能位于其他地方。要以可移植的方式查找桌面路径,请参阅如何获取桌面位置?。
错误计算..
相对路径中的 s 数,或不恰当地重复路径中的文件夹名称也很常见。以编程方式构建路径时要特别小心。最后,请记住,如果已经在根目录中(在 Linux 或 Mac 上,或 Windows 上的驱动器根目录),..
则不会产生任何影响。/
根据用户输入构建路径时,要特别小心。如果输入未经清理,可能会发生不好的事情(例如,允许用户将文件解压到会覆盖重要内容的文件夹中,或者不应该允许用户写入文件)。
~
另一个常见的问题是,当前用户主目录的特殊快捷方式在 Python 程序中指定的绝对路径中不起作用os.path.expanduser
。必须使用 明确将路径的该部分转换为实际路径。请参阅为什么我被迫在 python 中使用 os.path.expanduser?和os.makedirs 不理解我的路径中的“~”。请记住,这
os.listdir
只会提供文件名,而不是路径。尝试迭代以这种方式列出的目录仅当该目录是当前工作目录时才有效。确保实际文件名也很重要。Windows 有一个选项可以在 GUI 中隐藏文件扩展名。如果您
foo.txt
在窗口中看到,则可能是文件的实际名称是foo.txt.txt
,或其他名称。您可以在设置中禁用此选项。您还可以使用命令行验证文件名;dir
将告诉您文件夹中的真实内容。(ls
当然,Linux/Mac 的等效名称是 ;但问题不应该首先出现在那里。)普通字符串中的反斜杠是转义序列。当在 Windows 上尝试使用反斜杠作为路径分隔符时,这会导致问题。但是,使用反斜杠进行此操作不是必需的,通常也不建议这样做。请参阅如何在 Python 字符串文字中编写 Windows 路径?。
当尝试使用 之类的文件模式创建新
w
文件时,新文件的路径仍然需要存在 - 即所有中间文件夹。例如,如果目录不存在,尝试使用 open(filename, 'w' ) 会给出 IOError: [Errno 2] 没有这样的文件或目录。还请记住,新文件名必须有效。特别是,尝试在文件名中插入格式的日期将不起作用,因为s 将被视为路径分隔符。MM/DD/YYYY
`/`
解决方案 7:
确保文件路径下的所有文件夹都存在。
我收到此错误是因为我不知道该文件夹是否正在创建,因为理论上,代码中调用的函数应该执行此操作。
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')
),最终导致此错误。
解决方案 8:
(适用于 Pycharm)
Pycharm 有内置的“Active Directory”设置
更改文件夹名称时可能会收到此错误,因为此设置未更新。要在 Pycharm 中修复此错误,请选择“编辑配置”(窗口右上角,运行按钮旁边)。
然后更改脚本路径(以防您还没有更改)和工作目录文件夹。
解决方案 9:
检查提到的路径,无论它是绝对路径还是相对路径。
如果类似于--> /folder/subfolder/file
-->计算机将在根目录中搜索文件夹。
如果类似于--> ./folder/subfolder/file
-->计算机将在当前工作目录中搜索文件夹。
解决方案 10:
如果您使用的是 VScode 之类的 IDE,请确保您从保存要访问的文件的同一目录打开了 IDE。
例如,如果您想访问文档中的 file.txt,请尝试从文档中打开 IDE,方法是右键单击目录,然后单击“打开方式”
解决方案 11:
可能出现故障的情况有多种:
os.scandir()
如果目标文件是符号链接,并且您通过等获得了引用os.listdir()
,然后尝试调用.stat()
损坏的符号链接,那么stat()
将尝试对不存在的符号链接目标进行调用,而不是符号链接本身。
默认情况下.stat()
用 调用.stat(*, follow_symlinks=True)
;.stat(follow_symlinks=False)
用于防止跟踪(损坏的)符号链接。
解决方案 12:
这对我有用,对你也应该有用。
#get current working directory
os.getcwd()
#trim till directory you want the resource till and get 0th from split
os.getcwd().split(dir_in_str)[0]
#list files and dirs inside dir
os.listdir(dir_in_str)
#append environment independent path seperator
path = path + f'{os.path.sep}'
#search if string is present or endswith in path
if str in path:
祝您编码愉快.. ;)
解决方案 13:
就我而言,它是有效的。我正在使用位于项目目录中 rest_api 目录中的 json。
然后我改变了
f = open('rest_api/contacts0.json')
到
f = open('../rest_api/contacts0.json')
添加 ../ 后就可以读取文件了。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件