os.path.realpath(_file_)
已知本文件名为 test1.py. 绝对路径为: C:\Desktop\scripts\perf\nvmf\test1.py
u = os.path.realpath(__file__)
print(u)
>>> C:\Desktop\scripts\perf\nvmf\test1.py
所以 os.path.realpath( _file_),是得到本文件的绝对路径(真实路径),精确到文件名
,是对给定文件名前加上当前工作目录的绝对路径,至于你给定的文件名对应文件是否真的存在并不关心(因为你有可能是想要创建文件呢)
那么关于真实路径,是当存在软链接的时候,可以返回真实文件的路径
os.path.dirname(path)
已知本文件名为 test1.py. 绝对路径为: C:\Desktop\scripts\perf\nvmf\test1.py
x = os.path.dirname(os.path.realpath(__file__))
print(x)
>>> C:\Desktop\scripts\perf\nvmf
所以 os.path.dirname(path) , 是得到 括号内 path 的上一级路径
os.path.join()
1,拼接
x = os.path.join('root','test','110.txt')
print(x)
>>> root/test/110.txt
可以看出,os.path.join() 有拼接作用,而且是把括号里的每个元素用 ‘/’ 给拼接起来,里面的元素不限于三个,因为源码中的参数是 *path, 是个不定长参数。
2, 识别 ‘/’ ,即绝对路径,Windows则是 ‘\’
x = os.path.join('home','/hzx','spdk','/perf')
print(x)
>>> /perf
可以看出,只留下来了最后一个 “ /perf ”, 这是因为只要最后一个 ‘/’ 的元素出现了,那么就把前面的都舍弃,然后继续拼接后面的。
注意:不是关乎 ‘/’ 这个符号,而是它的意义是代表绝对路径。
下面的例子中
x = os.path.join('home','/hzx','spdk','/perf', '../../..')
print(x)
>>> /perf/../../..
你看,最后一个元素中也有 ‘/’, 但还是老老实实的拼接上去了。
3, 最后元素为空处理
x = os.path.join('home','hzx','spdk','perf', '')
print(x)
>>> /home/hzx/spdk/perf/
当我们需要在路径后面加上 一个斜杠 ‘/’, 那么可以这么干,将最后一个元素设为空,这样再拼接会自动将 ‘/’ 给拼上去。
os.path.abspath(path)
u = os.path.abspath(__file__)
print(u)
>>> C:\Desktop\scripts\perf\nvmf\test1.py
大家肯定感觉 os.path.abspath(path) 和 前面的os.path.realpath(path) 一样,因为源码中在 abspath 方法中,有这么一行代码
def abspath(path):
...
# realpath is a no-op on systems without islink support
realpath = abspath
....
当然这两种方法就大同小异了,但是还是有一点小不同的。
之前说 os.path.realpath(path) 即使在有软链接的情况下,还是返回真实文件的路径。
而源码中的那句注释就说明了 os.path.abspath(path) 对软链接的支持。
>>> -rw-rw-r-- 1 guest guest 0 Jun 16 08:36 a
>>> lrwxrwxrwx 1 guest guest 1 Jun 16 08:36 b -> a
>>> from os.path import abspath, realpath
>>> abspath('b')
'/home/guest/play/paths/b'
>>> realpath('b')
'/home/guest/play/paths/a'
除去得到文件路径的简单作用,os.path.realpath(path) 还可以对路径进行操作
x = 'C:\Desktop\scripts\perf\nvmf\test1.py'
y = os.path.abspath(os.path.join(x, "../../../"))
print(y)
>>> C:\Desktop\scripts
我们都知道,../../..
是路径往上三级,而 os.path.abspath 通过将 路径与../../..
拼接竟然就可以直接操作了。
但是首先我们是需要通过 os.path.join 去拼接的,千万不要忘记