在Python中显示所有父文件夹

2024-06-07 09:28:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

返回

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

注意代码不必检查文件是否存在,但如果有一个尾随正斜杠、环绕空格或两个并排正斜杠,我不希望出现虚假输出


Tags: 文件答案代码文件夹home情况documents空格
3条回答

应该处理好所有事情。你知道吗

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()(如其他答案所述)

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/');

使用module 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/../../../../../../')
['/']

相关问题 更多 >

    热门问题