解决 Python 中的相对路径问题

在项目代码中如果要访问文件,最好是使用相对路径,这样能够提高项目的可迁移性。但在 Python 中,使用相对路径可能会存在问题。

问题描述

| -- root
| -- test目录
| -- read_file.py
| -- file.txt
| -- main.py

对于上述的项目结构,如果在 read_file.py 中想要读取 file.txt 文件,需要使用的命令是 open(“./file.txt”, “r”)。此时单独运行 read_file.py 文件,可以正确读取文件。但如果在 main.py 中 import 了 read_file.py,然后运行 main.py 去读取文件,且保持 open(“./file.txt”, “r”) 不变,就会报错说找不到该文件。

问题分析

os.getcwd() 命令可以获取当前的运行路径,将其写入 read_file.py 文件中。单独运行 read_file.py 时,输出 /root/test;如果在 main.py 中引入 read_file.py 后再运行 main.py,就会输出 /root。这说明即使代码在 test 目录下,但运行路径仍然在 /root 下,不会随着代码位置的改变而改变,只会一直在根目录下。

解决方案

可以使用 os.path.dirname(__file__) 获得当前文件的绝对位置,然后后面加上要读取文件的名字。

current_path = os.path.dirname(__file__)  # 得到当前文件的路径

def read_file() :
with open(current_path + "/file.txt" , "r") as f_obj :
content = f_obj.readline()
print("文件内容 - %s" %content)

if __name__ == '__main__' :
read_file()

如果 read_file.py 想要访问根目录下的另一个子目录中的文件,如 /root/test2,也可以使用../ 来实现:os.path.dirname(__file__)/../test2