モジュールの関数を使用します。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/../../../../../../')
['/']