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+.
中调用 dirname 或 Path(__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.")
在 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+.
中调用 dirname 或Path(__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.")