使用模塊os.path
中的功能 - 它與平臺無關,即相同的代碼可用於Windows路徑(在Windows安裝中運行時)。
使用os.path.normpath()
可以很好地處理重複和尾隨路徑分隔符以及包含「..」的路徑。使用此代替os.path.abspath()
,因爲從非絕對路徑上的不同目錄運行時會得到不同的結果。
import os.path
def get_parents(path):
parents = []
path = os.path.normpath(path)
while path:
parents.insert(0, path)
if path == '/':
path = ''
else:
path = os.path.dirname(path)
return parents
>>> print get_parents('')
['.']
>>> print get_parents('/')
['/']
>>> print get_parents('/////')
['/']
>>> print get_parents('/home/marx/Documents/papers/communism')
['/', '/home', '/home/marx', '/home/marx/Documents', '/home/marx/Documents/papers', '/home/marx/Documents/papers/communism']
>>> print get_parents('/home/marx/Documents/papers/communism/')
['/', '/home', '/home/marx', '/home/marx/Documents', '/home/marx/Documents/papers', '/home/marx/Documents/papers/communism']
>>> print get_parents('////home/marx////Documents/papers/communism/////')
['/', '/home', '/home/marx', '/home/marx/Documents', '/home/marx/Documents/papers', '/home/marx/Documents/papers/communism']
>>> print get_parents('home/marx////Documents/papers/communism/////')
['home', 'home/marx', 'home/marx/Documents', 'home/marx/Documents/papers', 'home/marx/Documents/papers/communism']
>>> print get_parents('/home/marx////Documents/papers/communism/////../Das Kapital/')
['/', '/home', '/home/marx', '/home/marx/Documents', '/home/marx/Documents/papers', '/home/marx/Documents/papers/Das Kapital']
>>> print get_parents('/home/marx////Documents/papers/communism/////../Das Kapital/')
['/', '/home', '/home/marx', '/home/marx/Documents', '/home/marx/Documents/papers', '/home/marx/Documents/papers/Das Kapital']
>>> print get_parents('/home/marx////Documents/papers/communism/////../Das Kapital/../../../../../../')
['/']
這是所有答案中最好的。小記,至少在Mac上(在家裏沒有linux),前導或尾隨空格導致奇怪的行爲。 – puk
@puk:奇怪的行爲?在* nix空格中是一個有效的文件/目錄名,例如''/ a/b/c/d''是有效的。它分解爲'['','/ a','/ a/b','/ a/b/c','/ a/b/c/d'] – mhawke
@puk:的空間作爲要求,但它們的確可以是有效的名稱。如果你真的想要它們,使用'/ a/b/c/d'.strip()。 – lgautier