【问题标题】:File operations not working in relative paths文件操作在相对路径中不起作用
【发布时间】:2020-04-15 22:28:43
【问题描述】:

我正在开发一个文件结构相当简单的 python3 应用程序,但我在读取脚本中的文本文件时遇到问题,这两个文件的文件结构都低于调用它们的脚本。绝对清楚,文件结构如下:

app/
|- cli-script
|- app_core/
   |- dictionary.txt
   |- lib.py

cli-script 调用lib.py,而lib.py 需要dictionary.txt 来做我需要它做的事情,所以它会被打开并读入lib.py

cli-script 的基本内容如下所示:

from app_core import lib
def cli_func():
  x = lib.Lib_Class()
  x.lib_func()

lib的问题区域在这里:

class Lib_Class:
  def __init__(self):
    dictionary = open('dictionary.txt')

我遇到的问题是,虽然我有这个文件结构,但 lib 文件找不到字典文件,返回 FileNotFoundError。出于可移植性的原因,我宁愿只使用相对路径,否则我只需要使解决方案与操作系统无关。符号链接是我想出的最后选择,但我想不惜一切代价避免它。我有哪些选择?

【问题讨论】:

  • 请展示最简单的代码,突出您遇到的问题。
  • @JonathonReinhart 这只是一个简单的open(dictionary.txt) 调用导致找不到文件错误
  • 请提供cli-script中调用lib.py的代码,以及lib.py中访问文本文件的代码。两者都在上下文中。
  • @blueteeth 刚刚编辑了帖子以包含代码片段
  • 我很惊讶 lib 导入时 app-core 被命名为这样(带有连字符),并且没有 __init__.py。我希望app-core 被称为app_core,并且会有一个空文件app_core/__init__.py

标签: python python-3.x file-io io file-not-found


【解决方案1】:

当您运行 Python 脚本时,涉及路径的调用是相对于您运行它们的位置执行的,而不是文件实际来自的位置。

__file__ 变量存储当前文件的路径(无论它在哪里),因此相对文件将是该文件的兄弟。

在你的结构中,__file__ 指的是路径app/app_core/lib.py,所以要创建app/app_core/dictionary.txt,你需要先向上再向下。

app/app_core/lib.py

import os.path

class Lib_Class:
  def __init__(self):
    path = os.path.join(os.path.dirname(__file__), 'dictionary.txt')
    dictionary = open(path)

或使用pathlib

path = pathlib.Path(__file__).parent / 'dictionary.txt'

【讨论】:

  • 这成功了!我今晚无法让 pathlib 工作,但考虑到你提供了 2 种方法,这不是问题
【解决方案2】:

因为您希望 dictionary.txt 与您的 lib.py 文件出现在同一路径中,您可以执行以下操作。

而不是dictionary = open('dictionary.txt') 使用

dictionary = open(Path(__file__).parent / 'dictionary.txt')

【讨论】:

  • 是来自 pathlib 或 os 的 Path
  • 来自pathlibfrom pathlib import Path
  • 我也更新了答案,一定是Path(__file__).parent
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 2018-04-06
  • 1970-01-01
  • 2011-12-09
  • 2014-07-11
  • 2013-10-22
  • 1970-01-01
相关资源
最近更新 更多