Python 常见的几种处理路径问题

Python 虽然很方便,文档资料也是随处可见,本文内容也不是创新的内容,只是希望简单的总结一下编程中常见的处理路径的问题,希望对大家有所帮助。

如何获得当前文件的路径

一般这里指的路径分两种,一个是绝对路径,另一个是相对路径。

那么我们简单先介绍下几种路径的获得方法,最后看看例子。

__file__

这是python内置的变量,表示包含文件名称的路径,可以肯定的是,
这个变量中一定包含文件名称,至于路径因执行 python 的方法不同而不同。

os.getcwd()

这是os模块的函数,不是os.path。

它返回的是平台支持的文件路径,并不包含文件名称,而是路径的绝对值。

os.path.realpath(__file__)

返回指定文件名的规范路径,消除路径中遇到的任何符号链接,
一般大部分系统都支持它。

os.path.abspath(__file__)

返回路径名路径的标准化绝对化版本。在大多数平台上,这等效于按如下方式:
os.path.normpath(os.path.join(os.getcwd(), __file__)) 等价于 os.path.abspath(__file__)。

sys.path[0]

sys.argv[0]|获得模块所在的路径,一般由系统决定是否是全名。

前面介绍了5种方法,我们一起看看在不同条件下的输出情况:

文件内容:

1
2
3
4
5
6
7
8
9
10
#! /usr/bin/env python3
#filename: filename_test.py

import os,sys

print("filename:[__file__] >", __file__)
print("filename:[os.getcwd()] >", os.getcwd())
print("filename:[os.path.realpath(__file__)] >",os.path.realpath(__file__))
print("filename:[os.path.abspath(__file__)] >", os.path.abspath(__file__))
print("filename:[sys.path[0]] >", sys.path[0])

输出内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[cmd] > python filename_test.py
filename:[__file__] > filename_test.py
filename:[os.getcwd()] > /home/rex/C_LD/common_Makefile/scirpts
filename:[os.path.realpath(__file__)] > /home/rex/C_LD/common_Makefile/scirpts/filename_test.py
filename:[os.path.abspath(__file__)] > /home/rex/C_LD/common_Makefile/scirpts/filename_test.py
filename:[sys.path[0]] > /home/rex/C_LD/common_Makefile/scirpts

[cmd] > python ../scirpts/filename_test.py
filename:[__file__] > ../scirpts/filename_test.py
filename:[os.getcwd()] > /home/rex/C_LD/common_Makefile/scirpts
filename:[os.path.realpath(__file__)] > /home/rex/C_LD/common_Makefile/scirpts/filename_test.py
filename:[os.path.abspath(__file__)] > /home/rex/C_LD/common_Makefile/scirpts/filename_test.py
filename:[sys.path[0]] > /home/rex/C_LD/common_Makefile/scirpts

[cmd] > ./filename_test.py
filename:[__file__] > ./filename_test.py
filename:[os.getcwd()] > /home/rex/C_LD/common_Makefile/scirpts
filename:[os.path.realpath(__file__)] > /home/rex/C_LD/common_Makefile/scirpts/filename_test.py
filename:[os.path.abspath(__file__)] > /home/rex/C_LD/common_Makefile/scirpts/filename_test.py
filename:[sys.path[0]] > /home/rex/C_LD/common_Makefile/scirpts

一般获得当前模块或者你称之为脚本文件的绝对路径,使用:

1
os.path.dirname(os.path.realpath(__file__))

看到了说出应该差不多就明白了,不过具体的细节请查看官方文档
当然看看源码也是有好处的,如果你有时间的话。

其他常用的路径操作手法

获得文件名称

1
os.path.basename(__file__)

获得文件名称和绝对路径

1
os.path.split(os.path.realpath(__file__))

其他的路径裁剪,都可以使用本文提供的方法,
加上适当的os.path模块中的处理函数,来满足你的要求。

Comments

⬆︎TOP