微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Python中获取导入模块的文件相对路径的文件路径

如何解决在Python中获取导入模块的文件相对路径的文件路径

我在 my_program.py 中有此代码

from my_module import do_stuff_with_file

do_stuff_with_file("hi.txt")

这是my_module.py

def do_stuff_with_file(fileName):
    print(fileName)
    # do stuff with the file

my_module.pymy_program.py 不在同一目录中时,会出现文件未找到错误。此问题已使用此代码 (my_module.py) 解决

def do_stuff_with_file(fileName):
    fileName = os.path.join(os.path.dirname(sys.modules['__main__'].__file__),fileName)
    print(fileName)
    # do stuff with file

my_program.py 由不同目录中的文件导入时会出现问题。

我该如何解决这个问题?

解决方法

给定以下文件层次结构:

stack_overflow/
├─ q67993523/
   ├─ my_module/
   │  ├─ __init__.py
   ├─ 67993523.py
   ├─ hi.txt

具有以下文件内容:

# 67993523.py
from my_module import do_stuff_with_file

do_stuff_with_file("hi.txt")
# my_module/__init__.py
def do_stuff_with_file(filename):
    print(f"{filename!s} content is :")
    with open(filename,"rt") as file:
        print(file.read())

和文件 hi.txt :

Hello !

当我运行 C:\path\to\python.exe C:/stack_overflow/q67993523/67993523.py 时(q67993523 中包含 PYTHONPATH 的路径),当前目录为 q67993523/,我得到:

hi.txt content is :
Hello !

但是如果我将当前目录更改为 q67993523/my_module/ 并执行完全相同的命令,我会得到:

hi.txt content is :
Traceback:
[...]
FileNotFoundError: [Errno 2] No such file or directory: 'hi.txt'

因为相对于当前工作目录 q67993523/my_module/ 没有文件 hi.txt,所以文件应该是 ../hi.txt

我认为您正在做的是 XY problem 的一个实例。

您想要实现的是找到一个给定名称而不是位置的文件。这很难做到,容易出错,并且需要很多hacks
我不认为这是实际上你想要做的。我想你想做的不是搜索文件,而只是使用它们。所以你不应该丢失他们位置的宝贵信息。

例如,在您的主脚本(我的是 67993523.py)中,您知道该文件就在同一目录中。但是如果你只是发送hi.txt,因为函数不知道调用她的代码的文件位置,它不知道去哪里搜索文件。
而是提供完整的文件位置,即绝对路径。

如果我将主脚本更改为:

# 67993523.py
from pathlib import Path

from my_module import do_stuff_with_file

the_directory_of_this_pyfile = Path(__file__).parent
do_stuff_with_file((the_directory_of_this_pyfile / "hi.txt").absolute())

并使用我当前的目录 q67993523/ 运行它,我得到:

C:\stack_overflow\q67993523\hi.txt content is :
Hello !

当我将当前目录更改为 q67993523/my_module/ 时,我得到同样的结果:

C:\stack_overflow\q67993523\hi.txt content is :
Hello !

不同之处在于,在您的脚本中,hi.txt 文件名假定您当前的工作目录是 q67993523/。如果您有一个不同的当前工作目录(因为 Pytest,因为在您想要的任何地方运行脚本,...请参阅@tdelaney 的评论)那么没有 ./hi.txt 文件,所以它会失败。

我鼓励您学习 current working directory 以及如何表达current Python file directory

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?