Python - 调用子模块时的相对文件位置

Python - Relative file locations when calling submodules

在 Python 中,我试图从 "last" 函数(找不到更好的词)所在的目录访问文件。

例如,假设我有以下文件:

C:/
    foo.py
    package/
        helper.py
        text.md

foo.py 有:

from package import helper

helper.edit_file("text.md")

helper.py 有:

from os.path import abspath

def edit_file(file_location):
    with open(abspath(file_location), "w") as file:
        file.write("This file has been written to.")

而text.md只是一个空的文本文件。

当我直接从 helper.py 运行 edit_file("text.md") 时,它会正确地写入 package/text.md。但是,当我 运行 foo.py 时,它不会写入 package/text.md,而是在与 foo.py 相同的目录级别中创建一个新的 text.md。我假设发生这种情况是因为它采用了 foo.py 所在位置的绝对路径。

是否可以仅从 helper.py 获取绝对路径,以便它始终写入 package/text.md,无论对 edit_file(file_location) 的原始调用在哪里?

我认为 edit_file() 中的 file_location 不明确 - 它必须是完整路径,或者是稍后添加到某个目录的文件名。此外 abspath() 在给定文件上创建绝对路径,但不会 select 为您创建目录。

在您的情况下,您需要为文件设置目录并明确创建完整路径。查找给定文件的目录名称的常用方法是 os.path.dirname(os.path.abspath(__file__))__file__ 是与单个文件关联的 python 内部变量,它包含文件路径。

helper.py 可以是这样的:

import os
BASEDIR = os.path.dirname(os.path.abspath(__file__))

def make_path(filename, directory=BASEDIR):
    return os.path.join(directory, filename) 

def edit_file(filename):
    with open(make_path(filename), "w") as file:
        file.write("This file has been written to.")

您还可以为包中的 markdown 文件设置一个特定的目录 - 通常您不会写入代码所在的文件夹。您可以通过在 Python 3.6+.

中调用 dirnamePath(__file__).parents[n] 来导航到您的项目根目录

特别是 Python 3.6 helper.py 中的代码更加简洁:

from pathlib import Path 

def update(filename: str, text: str):
    path = Path(__file__).parent / filename 
    path.write_text(text)

update("text.md", "This file has been written to.")