如何根据模块路径在python包中创建文件?

时间:2018-08-02 20:11:33

标签: python python-3.x

我有一个这样布置的项目:

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

有没有办法做这样的事情?

1 个答案:

答案 0 :(得分:1)

从文件加载的模块通常具有__file__属性。您可以以此为出发点来解决您的包裹。您可以使用os.pathpathlib中的实用程序来浏览路径。以下任何一种都可以工作:

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