【问题标题】:Why am I getting a FileNotFoundError?为什么我会收到 FileNotFoundError?
【发布时间】:2013-07-13 14:09:33
【问题描述】:

我正在尝试编写一个简单的程序来读取文件并搜索一个单词,然后打印在文件中找到该单词的次数。每次我输入“test.rtf”(这是我的文档的名称)时,我都会收到此错误:

Traceback (most recent call last):
  File "/Users/AshleyStallings/Documents/School Work/Computer Programming/Side Projects/How many? (Python).py", line 9, in <module>
    fileScan= open(fileName, 'r')  #Opens file
FileNotFoundError: [Errno 2] No such file or directory: 'test.rtf'

上学期上课时,记得我的教授说你必须把文件保存在一个特定的地方?我不确定他是否真的这么说,但如果有帮助的话,我正在运行苹果 OSx。

这是我的代码的重要部分:

fileName= input("Please enter the name of the file you'd like to use.")
fileScan= open(fileName, 'r')  #Opens file

【问题讨论】:

  • 因为你没有给出路径,所以文件应该在你运行脚本的目录中。可能是/Users/AshleyStallings/Documents/School Work/Computer Programming/

标签: python file path


【解决方案1】:

首先检查您的文件格式是什么(例如:.txt、.json、.csv 等),

如果您的文件存在于 PWD 中,则只需在单('')或双(“”)引号内提供文件名以及文件格式,并根据您的要求提供适当的操作模式

例如:

with open('test.txt','r') as f: data=f.readlines() for i in data: print(i) 如果您的文件存在于其他目录中,则只需给出您的文件所在的完整路径名和文件名以及单('')或双(“”)引号内文件的文件格式和适当的操作模式根据您的要求。

如果它显示 unicode 错误,只需将 r 放在文件路径的引号之前,或者放在 '/' 而不是 ''

with open(r'C:\Users\soman\Desktop\test.txt','r') as f: data=f.readlines() for i in data: print(i)

【讨论】:

    【解决方案2】:

    您可能需要通过以下方式更改路径:

    import os
    path=os.chdir(str('Here should be the path to your file')) #This command changes directory
    

    这至少对我有用!希望它也对你有用!

    【讨论】:

      【解决方案3】:

      我犯的错误是 我的代码:

      x = open('python.txt')

      打印(x)

      但问题出在文件目录中,我将其保存为 python.txt 而不是 python。

      所以我的文件路径是 ->C:\Users\noob\Desktop\Python\Course 2\python.txt.txt

      这就是它给出错误的原因。

      将文件命名为不带 .txt 的文件,它将运行。

      【讨论】:

        【解决方案4】:

        一个好的开始是验证输入。换句话说,您可以确保用户确实为真实的现有文件键入了正确的路径,如下所示:

        import os
        fileName = input("Please enter the name of the file you'd like to use.")
        while not os.path.isfile(fileName):
            fileName = input("Whoops! No such file! Please enter the name of the file you'd like to use.")
        

        这得益于内置模块os 的帮助,这是标准 Python 库的一部分。

        【讨论】:

        • FWIW,通常使用 try-except 是更好的做法,即try: open(fileName); except FileNotFoundError: print('Whoops! No such file!') ...
        【解决方案5】:

        如果用户没有传递文件的完整路径(在 Unix 类型系统上,这意味着以斜杠开头的路径),则该路径相对于当前工作目录进行解释。当前工作目录通常是您启动程序的目录。在您的情况下,文件test.rtf 必须在您执行程序的同一目录中。

        您显然是在 Mac OS 下使用 Python 执行编程任务。在那里,我建议在终端中工作(在命令行上),即启动终端,cd 到输入文件所在的目录,然后使用命令在那里启动 Python 脚本

        $ python script.py
        

        为了完成这项工作,包含 python 可执行文件的目录必须位于 PATH 中,这是一个所谓的环境变量,其中包含在您输入命令时自动用于搜索可执行文件的目录。你应该利用它,因为它大大简化了日常工作。这样,您可以简单地 cd 到包含您的 Python 脚本文件的目录并运行它。

        在任何情况下,如果您的 Python 脚本文件和数据输入文件不在同一个目录中,您始终必须指定它们之间的相对路径,或者必须为其中之一指定绝对路径。

        【讨论】:

        • 非常感谢!!有谁知道如何让我的程序搜索我的整个计算机以查找文档的名称?这样我就不必每次都将其保存到特定位置?
        • 你不想这样做,相信我。但是还有另一种机制可能会对您有很大帮助,请稍等一下,以便对我的答案进行编辑。
        • 我认为它的工作方式与使用终端大致相同:)
        【解决方案6】:

        如上所述,问题在于指定文件的路径。 OS X 中的默认路径是您的主目录(/Users/macbook 在终端中由 ~ 表示...您可以使用系统偏好设置 > 用户和组中的高级选项更改或重命名主目录)。

        或者您可以在文件名中指定从驱动器到文件的路径:

        path = "/Users/macbook/Documents/MyPython/"
        myFile = path + fileName
        

        您还可以捕获 File Not Found 错误并使用 try 给出另一个响应:

        try:
            with open(filename) as f:
                sequences = pick_lines(f)
        except FileNotFoundError:
            print("File not found. Check the path variable and filename")
            exit()
        

        【讨论】:

          【解决方案7】:

          test.rtf 是否位于您运行此程序时所在的同一目录中?

          如果没有,您需要提供该文件的完整路径。

          假设它位于

          /Users/AshleyStallings/Documents/School Work/Computer Programming/Side Projects/data

          在这种情况下,你会输入

          data/test.rtf

          作为你的文件名

          或者它可能在

          /Users/AshleyStallings/Documents/School Work/Computer Programming/some_other_folder

          在这种情况下,你会输入

          ../some_other_folder/test.rtf

          【讨论】:

          • 你知道为什么 fileScan.read() 中的 word 行:#checking for word accumulator += 1 不起作用吗?我不得不搜索“Ashley”这个词,当我的测试文档中只有 4 个词时,它返回说它被找到了 336 次......同样出于某种原因,当我打印它时,该行之后它发生了变化,而是打印 Ashley 它只打印 {
          • for word in foo: 为那个循环声明一个新变量 word,它会隐藏你现有的名为 word 的变量。然后,该迭代变量按顺序从 foo 中获取每个值,并执行请求的操作,在本例中为它添加一个。所以它做了336次添加。为什么是336?因为 file.read() 将文件的内容作为字符串返回,所以您正在迭代一个字符串,这是逐个字符完成的。所以总而言之,您的文件中必须有 336 个字符。
          • 好的,所以我把它改成了这个,所以它不会覆盖单词,但现在它返回 0。有没有办法让它搜索整个单词字符串?... 用于扫描在 fileScan.read(): #checking for word if scan == word: accumulator += 1
          • 我知道它正在检查每个字符......但我不知道如何让它检查每个单词......这是我第一次进行文件操作,对于所有小问题感到抱歉: )
          • 查看我发布的新答案 - cmets 中的代码示例效果不佳!
          【解决方案8】:

          很难在 cmets 中给出代码示例。

          要读取文件中的单词,您可以读取文件的内容,这会为您获取一个字符串 - 这是您之前所做的,使用 read() 方法 - 然后使用 split() 获取个别的话。 Split 在提供的分隔符上或默认情况下在空格上拆分字符串。例如,

          "the quick brown fox".split()
          

          产生

          ['the', 'quick', 'brown', 'fox']
          

          同样,

          fileScan.read().split()
          

          会给你一个字符串数组。 希望对您有所帮助!

          【讨论】:

          • 如果你不介意,我还有最后一个问题......我将把它作为答案发布,因为它有一些代码。
          • 其实我不是......它不会让我回答我自己的问题,因为我是这个网站的新手。非常感谢您的帮助!
          • 如果这是一个新问题,也许您应该将其作为新问题发布,而不是作为答案发布。 :P(这可能会吸引你更多的回应!)
          猜你喜欢
          • 1970-01-01
          • 2021-11-02
          • 1970-01-01
          • 2023-04-05
          • 2016-08-21
          • 2014-07-04
          • 2020-06-06
          • 2018-12-26
          • 2021-03-05
          相关资源
          最近更新 更多