2

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

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

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

返回

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

注意代码不必检查文件是否存在,但如果有尾部正斜杠、周围的空格或两个并排的正斜杠,我不想要虚假输出

4

4 回答 4

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/../../../../../../')
['/']
于 2012-05-30T07:09:45.520 回答
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']

编辑:正确处理“父母('////')”

编辑:通过添加可选参数“sep”来简化代码,并使用 normpath() (如另一个答案中所述)

于 2012-05-30T06:48:48.753 回答
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/');
于 2012-05-30T05:26:11.680 回答
-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' )
于 2012-05-30T03:36:23.570 回答