【问题标题】:Python can't open file "No such file or directory"Python无法打开文件“没有这样的文件或目录”
【发布时间】:2018-01-20 01:01:44
【问题描述】:
def main():
    fh = open('lines.txt')
    for line in fh.readlines():
        print(line)

if __name__ == "__main__": main()

目录文件

我在for-working.py 文件上,并试图访问同一工作目录中的lines.txt 文件。但我得到错误

没有这样的文件或目录:'lines.txt'

python打开文件需要绝对路径吗?

为什么这个相对路径在这里不起作用?

运行 python 3.6

编辑 ^1 我正在运行 Visualstudio 代码,其中包含 Don Jayamanne 的 python 包扩展,以及“Code Runner”包来编译/执行 python 代码

编辑 ^2 完全错误:

Traceback (most recent call last):
  File "c:\www\Ex_Files_Python_3_EssT(1)\Ex_Files_Python_3_EssT\Exercise Files\07 Loops\for-working.py", line 11, in <module>
    if __name__ == "__main__": main()
  File "c:\www\Ex_Files_Python_3_EssT(1)\Ex_Files_Python_3_EssT\Exercise Files\07 Loops\for-working.py", line 7, in main
    fh = open('lines.txt', 'r')
FileNotFoundError: [Errno 2] No such file or directory: 'lines.txt'

EDIT ^3检查 sys.path

import sys
print(sys.path)

产生此信息:

['c:\\www\\Ex_Files_Python_3_EssT(1)\\Ex_Files_Python_3_EssT\\Exercise Files\\07 Loops', 
'C:\\Users\\Kagerjay\\AppData\\Local\\Programs\\Python\\Python36\\python36.zip', 'C:\\Users\\Kagerjay\\AppData\\Local\\Programs\\Python\\Python36\\DLLs', 'C:\\Users\\Kagerjay\\AppData\\Local\\Programs\\Python\\Python36\\lib', 'C:\\Users\\Kagerjay\\AppData\\Local\\Programs\\Python\\Python36', 'C:\\Users\\Kagerjay\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages']

EDIT ^4检查 os.getcwd()

跑步

import os
print(os.getcwd())

生产

c:\www\Ex_Files_Python_3_EssT(1)\Ex_Files_Python_3_EssT\Exercise Files

它肯定不在正确的子目录中(需要cd 07 loops 文件夹,这可以缩小问题范围

编辑 ^5lines.txt 文件中的内容

我打开的lines.txt 文件如下所示。开始时没有多余的空格或任何东西

01 This is a line of text
02 This is a line of text
03 This is a line of text
04 This is a line of text
05 This is a line of text

摘要

Visual Studio 代码的 Code runner 扩展需要稍微调整以在子目录中打开文件,因此以下任何答案都将提供更强大的解决方案,以独立于 IDE 的任何扩展/依赖项

import os
print(os.getcwd())

对于诊断python解释器看到的当前目录的问题最有用

【问题讨论】:

  • 尝试使用fh = open(os.path.join(os.getcwd(), 'lines.txt'))
  • 你用的是什么IDE?
  • @GreenSaber 'r' 是默认参数,可以省略。
  • import sys; print (sys.path)时看到了什么
  • 在这种情况下相关的不是sys.path,而是os.getcwd()。检查import os; print(os.getcwd()) 的输出。如果它不是文件夹“07 Loops”的完整路径,则 Python 解释器正在从不同的目录运行。此外,这很愚蠢,但有时会发生,请确保文件“lines.txt”在其名称的开头或结尾没有任何额外的空格或类似的东西。

标签: python python-3.x io compiler-errors


【解决方案1】:

获取文件的目录,并加入你要打开的文件:

def main():
    dir_path = os.path.dirname(os.path.realpath(__file__))
    lines = os.path.join(dir_path, "lines.txt")
    fh = open(lines)
    for line in fh.readlines():
        print(line)

if __name__ == "__main__": main()

【讨论】:

  • 我按照你的建议做了,但我不知道我在这里做错了什么,参见图片i.imgur.com/SJIQTib.png
  • 不,用这 3 行替换您对 open 的呼叫。你的变成fh = open(lines)
  • 感谢这对您有很大帮助。 ... 到底做了什么? (我将您的第一个解决方案复制到下面的答案中)
【解决方案2】:

这应该可以解决问题。

def main():
    fh = open('lines.txt')
    for line in fh.readlines():
        print(line)

if __name__ == "__main__":
    import os

    curr_dir = os.path.dirname(os.path.realpath(__file__))  # get's the path of the script
    os.chdir(curr_dir)  # changes the current path to the path of the script
    main()

【讨论】:

  • 这行得通,但我觉得那是很多过多的代码,它并不是真正的 Pythonic 做事方式
  • 我不认为这是一个很好的解决方案。您不需要更改进程的工作目录来打开文件。这可能对过程的其他部分产生不必要的副作用。请参阅我的答案以获得更强大的解决方案,即确定文件的绝对路径。
【解决方案3】:

从帖子中未提及的其他人那里总结出我的问题的工作解决方案

手动直接绝对路径

def main():
    fh = open('lines.txt')
    for line in fh.readlines():
        print(line)

if __name__ == "__main__":
    import os

    curr_dir = 'c:\\www\\Ex_Files_Python_3_EssT(1)\\Ex_Files_Python_3_EssT\\Exercise Files\\07 Loops'
    os.chdir(curr_dir)
    main()

我在开头注释掉了不必要的部分...open(lines

以下解决方案非常适合惰性实现测试(例如复制粘贴模板),因为所有绝对路径校正代码都与其他所有代码分开(我的首选解决方案)

import os
dir_path = os.path.dirname(os.path.realpath(__file__))
lines = os.path.join(dir_path, "lines.txt")
# open(lines)
# ...

def main():
    fh = open(lines)
    for line in fh.readlines():
        print(line)

if __name__ == "__main__": main()

最强大的解决方案是下面的这个,因为它仅在调用 main() 时的函数定义中是自包含的。原始答案不包括import os,所以我把它包括在这里

def main():
    import os
    dir_path = os.path.dirname(os.path.realpath(__file__))
    lines = os.path.join(dir_path, "lines.txt")
    fh = open(lines)
    for line in fh.readlines():
        print(line)

if __name__ == "__main__": main()

【讨论】:

  • 查看我编辑的答案。省略号 (...) 只是用作代码的占位符,而不是实际代码。
  • 奇怪的是它仍然运行,即使使用...,python 解释器会像 cmets 一样忽略它吗?
  • 它说...是一个eillpisis对象/占位符stackoverflow.com/questions/42190783/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 2023-04-06
  • 2019-04-07
  • 2017-05-04
相关资源
最近更新 更多