递归拆分路径名(在Python中)?

时间:2010-02-18 07:33:48

标签: python shell

我觉得(应该是?)一个Python函数,递归地将路径字符串拆分为其组成文件和目录(超出basename和dirname)。我已经写了一篇,但是因为我在5台以上的计算机上使用Python进行shell脚本编写,所以我希望能够使用标准库中的某些东西,或者我可以在运行中使用更简单的东西。

import os

def recsplit(x):
    if type(x) is str: return recsplit(os.path.split(x))
    else: return (x[0]=='' or x[0] == '.' or x[0]=='/') and x[1:] or \
          recsplit(os.path.split(x[0]) + x[1:])

>>> print recsplit('main/sub1/sub2/sub3/file')
('main', 'sub1', 'sub2', 'sub3', 'file')

任何线索/想法? 〜感谢〜

3 个答案:

答案 0 :(得分:3)

更新:在使用altsep完成所有操作后,当前所选答案甚至不会在反斜杠上分割。

>>> import re, os.path
>>> seps = os.path.sep
>>> if os.path.altsep:
...   seps += os.path.altsep
...
>>> seps
'\\/'
>>> somepath = r"C:\foo/bar.txt"
>>> print re.split('[%s]' % (seps,), somepath)
['C:\\foo', 'bar.txt'] # Whoops!! it was splitting using [\/] same as [/]
>>> print re.split('[%r]' % (seps,), somepath)
['C:', 'foo', 'bar.txt'] # after fixing it
>>> print re.split('[%r]' % seps, somepath)
['C:', 'foo', 'bar.txt'] # removed redundant cruft
>>>

现在回到我们应该做的事情:

(更新结束)

1。仔细考虑您的要求 - 您可能得到您想要的,而不是您需要的。

如果您有相对路径
    r"./foo/bar.txt"(unix)和r"C:foo\bar.txt"(windows)
你想要吗?     [".", "foo", "bar.txt"](unix)和["C:foo", "bar.txt"](windows)
(注意那里的 C:foo )或者你想要什么?     ["", "CWD", "foo", "bar.txt"](unix)和["C:", "CWD", "foo", "bar.txt"](windows)
其中CWD是当前的工作目录(unix上的系统范围,Windows上的C:)?

2。你不需要用os.path.altsep来表达 - os.path.normpath()会使分隔符统一,并整理其他奇怪的内容,例如{{1 }}

解决方案步骤1:使用os.path.normpath()或os.path.abspath()中的一个取消链接路径。

第2步:执行unkinked_pa​​th.split(os.path.sep)并不是一个好主意。您应该使用os.path.splitdrive()将其拆分,然后使用os.path.split()的多个应用程序。

以下是Windows上步骤1中会发生的一些示例:

foo/bar/zot/../../whoopsy/daisy/somewhere/else

(当前驱动器为>>> os.path.abspath(r"C:/hello\world.txt") 'C:\\hello\\world.txt' >>> os.path.abspath(r"C:hello\world.txt") 'C:\\Documents and Settings\\sjm_2\\hello\\world.txt' >>> os.path.abspath(r"/hello\world.txt") 'C:\\hello\\world.txt' >>> os.path.abspath(r"hello\world.txt") 'C:\\Documents and Settings\\sjm_2\\hello\\world.txt' >>> os.path.abspath(r"e:hello\world.txt") 'E:\\emoh_ruo\\hello\\world.txt' >>> ,驱动器C上的CWD为C,驱动器E上的CWD为\Documents and Settings\sjm_2

我建议您在没有示例中的\emoh_ruoand集合的情况下编写第2步。编写代码,好像您的最终替代品知道您居住的地方并拥有电锯: - )

答案 1 :(得分:1)

使用它:

import os
def recSplitPath(path):
    elements = []
    while ((path != '/') and (path != '')):
        path, tail = os.path.split(path)
        elements.insert(0,tail)
    return elements

这会将/for/bar/whatever变为['for','bar','whatever]

答案 2 :(得分:0)

path='main/sub1/sub2/sub3/file'
path.split(os.path.sep)