【问题标题】:Parent folder script FileNotFoundError父文件夹脚本 FileNotFoundError
【发布时间】:2018-07-23 08:52:40
【问题描述】:

我的 Python 应用程序包含一个名为 Tests 的子文件夹,我用它来运行单元测试。我的所有文件都在父文件夹中,我将其命名为 App。 Tests 文件夹包含一个 test.py 文件。 App 文件夹包含一个 app.py 文件和一个 file.txt 文本文件。

在我的 test.py 文件中,我可以像这样进行导入:

import sys
sys.path.append("PATH_TO_PARENT_DIR")

假设我的 app.py 文件包含以下内容:

class Stuff():
    def do_stuff():
        with open("file.txt") as f:
            pass

现在如果我运行 test.py,我会收到以下错误:

FileNotFoundError: [Errno 2] No such file or directory: 'file.txt'

我该如何解决这个问题?非常感谢!

【问题讨论】:

  • 给出你的文本文件的完整路径...例如:C//user/full_path//file.txt
  • @sachindubey 为什么相对路径不起作用?
  • 对不起,我有点累了。我只是理解评论。 “给出完整路径”是什么意思?我是否必须手动将其添加到我的路径中,类似于将路径添加到父文件夹?

标签: python path file-not-found


【解决方案1】:

假设文件与您的脚本位于同一文件夹中:

import os
parent_dir = os.path.abspath(os.path.dirname(__file__))
class Stuff():
    def do_stuff():
        with open(os.path.join(parent_dir, "file.txt")) as f:
            pass

解释:

__file__ 是脚本的路径

os.path.dirname 获取脚本所在的目录

os.path.abspath 使该路径成为绝对路径而不是相对路径(以防相对路径弄乱您的脚本,这是一个好习惯)

那么我们需要做的就是将您的parent_dir 与文件合并,我们使用os.path.join 来做到这一点。

在此处阅读有关 os.path 方法的文档:https://docs.python.org/3/library/os.path.html

如果有帮助,可以像这样编写这段代码的更明确的版本:

import os
script_path = __file__
parent_dir = os.path.dirname(script_path)
parent_dir_absolute = os.path.abspath(parent_dir)
path_to_txt = os.path.join(parent_dir_absolute, 'file.txt')

【讨论】:

  • 感谢 Ofer,我使用了在其他地方找到的以下解决方案:MAIN_DIR = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
【解决方案2】:

open 函数在与调用open 函数的脚本 相同的文件夹中查找文件。因此,您的 test.py 会在测试文件夹中查找,而不是在 app 文件夹中。您需要添加文件的完整路径。

open('app_folder' + 'text.txt')

或将test.py 文件移动到与text.txt 相同的文件夹中

【讨论】:

  • 谢谢。你能给我一种方法来做到这一点而不明确给出父文件夹的路径吗?我的意思是使用 sys 函数。我也需要它在生产中工作,开始定义显式路径听起来不是一个好主意。
  • 您可以改用os.path.join(path, file),但事实仍然是您以某种方式必须定义文件所在的文件夹。如果它是父文件夹,您可以使用.. 作为路径,但最好的方法是在配置文件中定义该路径,并创建一个包装 open 的函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
相关资源
最近更新 更多