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

2024-11-20 08:44:00
admin
原创
12
摘要:问题描述:我正在尝试从我的 Python 脚本打开该文件recentlyUpdated.yaml。但是当我尝试使用:open('recentlyUpdated.yaml') 我收到一条错误消息:IOError: [Errno 2] No such file or directory: 'recentlyUpd...

问题描述:

我正在尝试从我的 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:Folderile.txt')  # absolute path

解决方案 2:

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

一个常见的误解是相对路径是相对于 Python 脚本的位置,但事实并非如此。相对文件路径始终相对于当前工作目录,并且当前工作目录不一定是 Python 脚本的位置。

您有三个选择:

  • 使用绝对路径打开文件:

file = open(r'C:path    oyourile.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    oyourile')
file = open('file.yaml')

可能导致“找不到文件”错误的其他常见错误包括:

  • 在文件路径中意外使用转义序列:

path = 'C:Users
ewtonile.yaml'
# Incorrect! The '
' in 'Users
ewton' is a line break character!

为了避免犯这个错误,请记住使用原始字符串文字作为文件路径:

path = r'C:Users
ewtonile.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.txtWindows 上的 表示“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')

添加 ../ 后就可以读取文件了。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用