我有一个这样布置的项目:
-proj/
-__init__.py
-main/
-__init__.py
-written_files/
-__init__.py
-scripts/
-create_file.py
在create_file.py
中,我想创建一个文件train.txt
,并将其放入proj/main/written_files/
我想知道我是否可以使用相对的包装结构。我当时想在create_file.py
中放入这样的内容:
train_file = open(proj.main.written_files.train.txt, 'w')
有没有办法做这样的事情?
答案 0 :(得分:1)
从文件加载的模块通常具有__file__
属性。您可以以此为出发点来解决您的包裹。您可以使用os.path
或pathlib
中的实用程序来浏览路径。以下任何一种都可以工作:
from os.path import dirname, join
filename = join(dirname(dirname(__file__)), 'main', 'written_files', 'train.txt')
OR
from pathlib import Path
filename = Path(__file__).parent.parent / 'main' / 'written_files' / 'train.txt'
在两种情况下,无论如何都使用上下文管理器来确保关闭文件:
with open(filename, 'w') as train_file:
...
这两个解决方案都不是超级优雅的,因为它们涉及到沿目录树走。相反,您可以从项目根目录开始,然后向下走:
filename = join(dirname(proj.__file__), 'main', 'written_files', 'train.txt')
OR
filename = Path(proj.__file__).parent / 'main' / 'written_files' / 'train.txt'
在两种情况下,proj.__file__
应指向根级别__init__.py
。