Python无法打开文件“没有这样的文件或目录”

时间:2017-08-11 13:28:04

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

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

if __name__ == "__main__": main()

目录文件

enter image description here

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

  

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

打开文件时python是否需要有绝对路径?

为什么这条相对路径不适用于此?

运行python 3.6

编辑^ 1 我正在运行带有Don Jayamanne的python包扩展的visualstudio代码,以及用于编译/执行python代码的“Code Runner”包

编辑^ 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'

编辑^ 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']

编辑^ 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文件夹,这会缩小问题

编辑^ 5 lines.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 interpreter看到

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:-1)

关于我的问题的工作解决方案的总结

中未提及的其他人

手动直接绝对路径

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()