天天看點

python OS.path相關使用

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 去拼接的,千萬不要忘記