[英]How to check if a path is absolute path or relative path in a cross-platform way with Python?
UNIX 絕對路徑以“/”開頭,而 Windows 以字母“C:”或“\”開頭。 python 是否有標准的 function 來檢查路徑是絕對路徑還是相對路徑?
如果路徑是絕對路徑, os.path.isabs
返回True
,否則返回False
。 文檔說它可以在 Windows 中運行(我可以親自確認它在 Linux 中運行)。
os.path.isabs(my_path)
如果您真正想要的是絕對路徑,請不要費心檢查它是否是,只需獲取abspath
:
import os
print os.path.abspath('.')
從python 3.4
pathlib可用。
In [1]: from pathlib import Path
In [2]: Path('..').is_absolute()
Out[2]: False
In [3]: Path('C:/').is_absolute()
Out[3]: True
In [4]: Path('..').resolve()
Out[4]: WindowsPath('C:/the/complete/path')
In [5]: Path('C:/').resolve()
Out[5]: WindowsPath('C:/')
使用os.path.isabs
。
import os.path
os.path.isabs('/home/user')
True
os.path.isabs('user')
False
實際上,我認為以上答案都沒有解決真正的問題:跨平台路徑。 os.path 所做的是加載依賴於操作系統的“路徑”庫版本。 所以解決方案是顯式加載相關(OS)路徑庫:
import ntpath
import posixpath
ntpath.isabs("Z:/a/b/c../../H/I/J.txt")
True
posixpath.isabs("Z:/a/b/c../../H/I/J.txt")
False
os.path
模塊將滿足您的所有需求。
@Zbyl 在DOS下,由於當前不同目錄的結果路徑不會改變,因此可以說是絕對路徑。 我說可以說是因為生成的路徑確實相對於當前驅動器發生了變化!
這是 DOS 遺留下來的,每個驅動器都有不同的當前目錄。
通過選擇不同的當前驅動器,您可以隱式更改當前目錄。 例如,我剛剛做了“CD”(DOS 等同於 pwd)
* CD
C:\Windows\System32
然后更改當前驅動器:
* t:
T:\
如果出乎意料,這是正確的。 因為我不記得 26 個當前目錄,所以我從不使用它。
另請注意,CD 已“損壞”:
T:\ * cd c:\Windows
T:\
當前目錄(在 t: 上)沒有改變,但在 C: 上改變了:我們只需更改當前驅動器即可看到:
T:\ * c:
c:\Windows *
我總是使用 pushd 來更改驅動器和目錄:
T:\ * pushd c:\Windows\assembly
c:\Windows\assembly *
由於網絡共享沒有卷,因此沒有設置當前目錄的明顯方法。 Pushd知道怎么做。 如果你做類似的事情
pushd \\myhost\myshare\folder
DOS/Windows 將共享映射到最后一個可用的驅動器號,通常是 Z。然后切換到您指定的文件夾。 這對於需要在當前目錄設置為批處理文件位置的情況下運行的批處理文件尤其重要。 為此,我開始使用許多批處理文件:
SETLOCAL EnableExtensions
pushd "%~dp0"
SETLOCAL 確保新映射的卷在批處理文件末尾未映射。 否則你會很快用完卷字母
os
或pathlib
庫。 使用os
>>> from os.path import isabs
>>> isabc("./")
False
>>> isabc("C:/")
True
使用pathlib
>>> from pathlib import Path
>>> Path("./").is_absolute()
False
>>> Path("C:/").is_absolute()
True
但正如@Shoham 在他的回答中所說的https://stackoverflow.com/a/41846670/14475596
實際上,我認為以上答案都沒有解決真正的問題:跨平台路徑。 os.path 所做的是加載依賴於操作系統的“路徑”庫版本。 所以解決方案是顯式加載相關(OS)路徑庫:
>>> import ntpath
>>> import posixpath
>>>
>>> ntpath.isabs("Z:/a/b/c../../H/I/J.txt")
>>> True
>>> posixpath.isabs("Z:/a/b/c../../H/I/J.txt")
>>> False
另一種方式,如果你不在當前的工作目錄中,有點臟,但它對我有用。
import re
path = 'my/relative/path'
# path = '..my/relative/path'
# path = './my/relative/path'
pattern = r'([a-zA-Z0-9]|[.])+/'
is_ralative = bool(pattern)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.