2014-02-10 92 views
2

我的路径文件列表,像这样:提取目录

paths = [ 
    'A/B/b.py', 
    'A/B/C/c1.py', 
    'A/B/C/c2.py', 
    'M/N/O/o1.py', 
    'M/N/O/o2.py', 
    'M/N/P/p1.py', 
    'M/N/P/p2.py', 
    'M/N/P/R/r2.py' 
] 

我想变换到一个目录列表如下:

only_dirs = [ 
    'A', 
    'A/B', 
    'A/B/C', 
    'M', 
    'M/N', 
    'M/N/O', 
    'M/N/P', 
    'M/N/P/R', 
] 

这些路径不存在于磁盘上,它们只是从DB收集的字符串,我想获取目录列表以根据路径中的任何目录过滤文件。这样做的最干净的方式是什么?

回答

4
result = set() 
for items in paths: 
    splitted = items.split("/")[:-1] 
    for idx in xrange(1, len(splitted) + 1): 
     result.add("/".join(splitted[:idx])) 

only_dirs = sorted(result) 
print only_dirs 

输出

['A', 'A/B', 'A/B/C', 'M', 'M/N', 'M/N/O', 'M/N/P', 'M/N/P/R'] 
+1

+1是迄今为止唯一的答案。 –

+1

我会使用'os.path.dirname()','os.path.split()'让它跨平台。 –

+0

@LaurIvan正确,但OP说“这些路径不存在于磁盘上,它们只是从数据库中收集的字符串,在问题:) – thefourtheye

0

EDITED ANSWER

为在thefourtheye评论指出的那样,我的第一个答案是不正确的。

这里是一个新的解决问题的方法:

only_dirs = [] 

for path in paths: 
    current = path[:path.rfind('/')] 
    while len(current) > 0: 
     if current not in only_dirs: 
      only_dirs.append(current) 
     current = current[:current.rfind('/')] 

only_dirs.sort() 
print only_dirs 
+0

这产生'[ 'A/B', 'A/B/C', 'A/B/C','M/N/O','M/N/O','M/N/P','M/N/P','M/N/P/R'] '这不是OP的预期。 – thefourtheye

+0

我编辑了我的答案以提供正确的输出。 – kaspermoerch