【问题标题】:Not finding any solution to [Errno 2]没有找到 [Errno 2] 的任何解决方案
【发布时间】:2020-12-06 07:55:41
【问题描述】:

我正在尝试使用一个程序来读取带有 pi 数字的文件。程序和带有 pi 数字的文本文件在同一目录中,但我仍然收到错误消息:

with open('pi_digits.txt') as file_object:
    contents = file_object.read()
print(contents.rstrip())

Traceback (most recent call last):
  File "C:\Python\Python_Work\python_crash_course\files_and_exceptions\file_reader.py", line 1, in <module>
    with open('pi_digits.txt') as file_object:
FileNotFoundError: [Errno 2] No such file or directory: 'pi_digits.txt'

我一直在寻找解决方案,但没有找到任何解决方案。

我发现了一段代码,据说它可以告诉我工作目录是什么。我得到一个输出,显示的目录比我有我的程序和文本文件的目录高 2 步。

import os

cwd = os.getcwd()  # Get the current working directory (cwd)
files = os.listdir(cwd)  # Get all the files in that directory
print("Files in %r: %s" % (cwd, files))

因此,当我将 pi 文本文档放在输出显示的目录 (>python_work) 中时,程序正在运行。当文本文件位于“files_and_exceptions”中时,它不起作用,这与程序本身所在的文件相同。我的目录在不工作时看起来像这样:

>python_work
   >python_crash_course
      >files_and_exceptions
          file_reader.py
          pi_digits.txt
          show_working_directory.py

当它工作时是这样的:

>python_work
    pi_digits.txt
   >python_crash_course
      >files_and_exceptions
          file_reader.py
          show_working_directory.py

我是 python 新手,非常感谢任何帮助。

谢谢!

【问题讨论】:

  • 从包含pi_digits.txt 文件的目录启动脚本。或者将完整路径作为文件名提供:with open(r'C:\Python\Python_Work\python_crash_course\files_and_exceptions\pi_digits.txt'):。如果您不提供完整路径,Python 期望您的文件位于您当前的工作目录中,即您在启动脚本时所在的目录。
  • 阅读本文以了解更多关于 Python 工作原理的信息:stackoverflow.com/questions/5137497/…
  • 这就是我所做的,我从包含我的 pi_digits.txt 的目录开始我的脚本。

标签: python errno


【解决方案1】:

相对路径(不以前导 / 开头)是相对于某个目录的。在这种情况下(通常*),它是相对于进程的当前工作目录的。

在您的情况下,鉴于您提供的信息,在第一种情况下它将是 "python_crash_course/files_and_exceptions/pi_digits.txt",因为您似乎正在从 python_work 目录运行脚本。

如果您知道该文件与脚本本身位于同一目录中,您也可以说:

import os.path
...
os.path.join(os.path.dirname(__file__), "pi_digits.txt")

而不是"pi_digits.txt"。或者同样使用pathlib:

from pathlib import Path
...
Path(__file__).with_name("pi_digits.txt")

实际上,除非您要锚定喜欢脚本本身,否则直接在代码中使用相对文件名/路径(使用绝对路径也会带来其自身的问题)是相当脆弱的,在这种情况下,将其作为一个参数函数(通常是 CLI 或脚本调用的最终参数)或从标准输入中读取它会更健壮。


* 我不会做出绝对的陈述,因为有些情况和功能可以显式提供不同的锚点(例如 os.path.relpathopenat(2);或者作为另一个示例符号链接目标)

【讨论】:

  • 感谢您的回答。据我了解您的回答,当文件和脚本都在同一个文件夹中时,我应该能够使用默认的标准路径(文件和脚本都在同一个文件夹中,并将 arg 作为文件名)。问题是,它们都在同一个文件夹中,但我仍然收到一条错误消息。
  • 我不确定我是否完全按照摘要进行,但我认为这不是我所说的。如果pi_digits.txt 和脚本位于同一位置,则可以使用任一 sn-p 来提供相对于脚本的路径(__file__,它本身将解析为正确的绝对路径)。既然你真的应该有一些固定点,如果那不是一个选项,文件名应该是一个运行时参数;或应考虑其他获取内容的方式,例如从标准输入读取)..
  • 这不是我的问题。我的问题是为什么这个特定场景不起作用。在我的 python 教育书中,这是作为一个例子给出的,所以我希望它可以工作,但它没有。我知道还有其他方法可以提供路径,我的问题只是关于为什么这不起作用。
  • 简短版本是:因为调用脚本时您位于与本书预期不同的目录中。从您最初开始的位置,在从同一个 shell 调用脚本之前执行cd python_crash_course/files_and_exceptions
  • 感谢您的回答。据我了解,无论是从我的书中还是从其他来源,只要脚本和文本文件都在同一个目录中,这种情况就应该有效。我想我的问题是为什么它对我不起作用,与这本书相比我做错了什么。如果您在这方面不能帮助我,我理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2016-07-23
  • 2020-05-30
  • 2019-06-30
相关资源
最近更新 更多