我觉得(应该是?)一个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')
任何线索/想法? 〜感谢〜
答案 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_path.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_ruo
和and
集合的情况下编写第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)