python - 文件操作在相对路径中不起作用
问题描述
我正在开发一个具有相当简单文件结构的 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
. 出于可移植性的原因,我宁愿只使用相对路径,否则我只需要使解决方案与操作系统无关。符号链接是我想到的最后选择,但我想不惜一切代价避免它。我有哪些选择?
解决方案
当您运行 Python 脚本时,涉及路径的调用是相对于您运行它们的位置执行的,而不是文件实际来自的位置。
该__file__
变量存储当前文件的路径(无论它在哪里),因此相对文件将是该文件的兄弟。
在您的结构中,__file__
指的是路径app/app_core/lib.py
,因此要创建app/app_core/dictionary.txt
,您需要先向上然后再向下。
应用程序/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'
推荐阅读
- postgresql - 使用变量作为结果数据集
- python - (初学者)Flask 动态路由不起作用
- firebase - 在 null 上调用了 getter 'iterator'。颤振和火力基地
- docker - 如何阻止不同 Docker 网络上的容器之间的通信?
- json - Spring WebClient 不处理 JSON 内容
- latex - 如何在乳胶表格中拆分单元格?
- java - 从 excel 中读取 SQL 查询,输出应保存在同一个 excel 中
- python-3.x - 卡在python中的一些函数
- r - 如何计算R中所有可能组合的比率和归一化比率?
- firebase - Firebase 推送通知 - React Native:未找到 GULApplication.h 文件