一个项目中的目录结构往往很复杂,模块之间互相调用来调用去。同时,相同的文件结构也会被部署到不同的环境。这也就意味着,引用文件的时候如果采用绝对路径的方式,到了后期是很难维护的。这一节我们来看看使用相对路径的一些方法。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
__file__变量
首先是__file__变量,其表示的是使用该变量的文件的完整路径。
有目录结构如下
(file) [fuhx@testmachine module1]$ tree
.
├── class1.py
└── class2.py
0 directories, 2 files
只有两个文件,其中class1.py
的内容如下
#/usr/bin/env python
def func1():
print(__file__)
if __name__ == '__main__':
func1()
此时运行该文件结果如下
/home/fuhx/python_projects/file/module1/class1.py
显示了class1.py
文件的完整路径。
如果是引用别的文件中的变量,则显示被引用文件的位置。
文件class2.py
的内容如下
#!/usr/bin/env python
def func2():
print(__file__)
在class1.py
中运行func2
#/usr/bin/env python
import os
import class2
def func1():
print(__file__)
class2.func2()
if __name__ == '__main__':
func1()
结果如下
/home/fuhx/python_projects/file/module1/class1.py
/home/fuhx/python_projects/file/module1/class2.py
不过需要注意一下,我在pycharm里面运行的时候都是好好的,在terminal中跑文件的时候有时候只会显示文件名,而不是完整路径,这时候就得借助os.path.abspath
这个函数了。
下面详细说说path模块。
path模块
这里说的path是os模块下的path,其用于处理一些和路径相关的操作。
例如上面所说的获取绝对路径
#/usr/bin/env python
import os
import sys
import class2
def func1():
#print(__file__)
print(os.path.abspath(__file__))
# class2.func2()
if __name__ == '__main__':
func1()
这样修改一下,不管是如何执行class1.py
文件,得到的结果都是一样的
/home/fuhx/python_projects/file/module1/class1.py
获取文件名
print(os.path.basename(__file__))
结果为
class1.py
获取目录名
通常用于获取同目录下的文件的绝对路径
print(os.path.dirname(__file__))
结果为
/home/fuhx/python_projects/file/module1
当然
os.getcwd()
也可以获取到当前目录
连接目录和文件
获取了目录名以后就可以通过连接来获取文件的完整路径了
#/usr/bin/env python
import os
import sys
import class2
def func1():
with open(os.path.join(os.path.dirname(__file__),'xiaofu.txt'),'a') as f:
f.write('life is beautiful')
if __name__ == '__main__':
func1()
这里的func1
就会在class1.py
的相同目录创建一个叫xiaofu.txt
的文件并写入内容
获取上级目录
使用两次os.path.dirname
就可以获得上级目录,多级目录以此类推
print(os.path.dirname(os.path.dirname(__file__)))
结果为
/home/fuhx/python_projects/file
总结
基本上有了这几个方法,再配合__file__
,在脚本里面去获取任意位置文件的绝对路径都不成问题了。当然os.path
还有很多有用的方法,例如判断是否是文件,是否是目录等等,不在这里的讨论范围了。