这属于为回答问题而提出问题的类别(尽管我会接受答案,如果他们比我的更好)
如何打印给定子文件夹的所有父文件夹的绝对路径。鉴于以下
'/home/marx/Documents/papers/communism'
返回
[
'/',
'/home',
'/home/marx',
'/home/marx/Documents',
'/home/marx/Documents/papers',
'/home/marx/Documents/papers/communism'
]
注意代码不必检查文件是否存在,但如果有正斜杠,周围空格或两个并排正斜杠,我不想要伪造输出< / p>
答案 0 :(得分:4)
使用模块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/../../../../../../')
['/']
答案 1 :(得分:1)
应该处理大部分事情。
import os
def parents(x, sep = os.path.sep):
x = os.path.normpath(x)
if x == sep: # bail out if only leading '/'s
return [x, ]
elements = x.split(sep)
res = list(sep.join(elements[:i]) for i in range(1, len(elements)+1))
res[0] = sep # fix leading /
return res
>>> x = '/home/marx/Documents///papers/communism/'
>>> parents(x)
['/',
'/home',
'/home/marx',
'/home/marx/Documents',
'/home/marx/Documents/papers',
'/home/marx/Documents/papers/communism']
编辑正确处理&#34;家长(&#39; ////&#39;)&#34;
编辑:通过添加可选参数&#34; sep&#34;来简化代码,并使用normpath()(如其他答案中所述)
答案 2 :(得分:0)
import os;
import sys;
def stripDoubleSlash(fullPath):
if fullPath:
replaced = fullPath.replace('//','/');
if replaced.find('//') >= 0:
return stripDoubleSlash(replaced);
else:
return replaced;
return fullPath;
def printAllParents(fullPath):
tokens = stripDoubleSlash(fullPath).rstrip('/').split('/');
for i in xrange(0,len(tokens)):
if i == 0 and not fullPath[0] == '/':
print tokens[0];
else:
print '/'.join(tokens[0:i])+'/'+tokens[i];
if __name__ == '__main__':
printAllParents(sys.argv[1] if len(sys.argv) > 1 else '/home/marx/Documents/papers/communism/');
答案 3 :(得分:-1)
这个最小的块效果很好,但如果有多个并排的正斜杠则会失败。
#!/usr/bin/env python
import os
def getParents ( path ):
parents = [ path ]
while path != '/':
path = os.path.dirname ( path )
parents.append ( path )
parents.reverse()
return parents
if __name__ == '__main__':
print getParents ( '/home/marx/Documents/papers/communism' )