在Python中显示所有父文件夹

时间:2012-05-30 03:34:54

标签: python tokenize

这属于为回答问题而提出问题的类别(尽管我会接受答案,如果他们比我的更好)

如何打印给定子文件夹的所有父文件夹的绝对路径。鉴于以下

'/home/marx/Documents/papers/communism'

返回

[
  '/',
  '/home',
  '/home/marx',
  '/home/marx/Documents',
  '/home/marx/Documents/papers',
  '/home/marx/Documents/papers/communism'
]

注意代码不必检查文件是否存在,但如果有正斜杠,周围空格或两个并排正斜杠,我不想要伪造输出< / p>

4 个答案:

答案 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' )