关于Python中路径的问题

时间:2009-07-14 13:30:55

标签: python operating-system

假设我的目录路径如下所示:

this/is/the/basedir/path/a/include
this/is/the/basedir/path/b/include
this/is/the/basedir/path/a
this/is/the/basedir/path/b

在Python中,我如何将这些路径分开,以便它们看起来像这样:

a/include
b/include
a
b

如果我运行os.path.split(path)[1],它将显示:

include
include
a
b

我应该在这里尝试一下,我应该查看一些正则表达式命令,还是可以在没有它的情况下完成?提前谢谢。

编辑全部:我使用正则表达式解决了它,该死的方便工具:)

4 个答案:

答案 0 :(得分:3)

也许这样的事情取决于你的前缀的硬编码方式:

def removePrefix(path, prefix):
    plist = path.split(os.sep)
    pflist = prefix.split(os.sep)
    rest = plist[len(pflist):]
    return os.path.join(*rest)

用法:

print removePrefix("this/is/the/basedir/path/b/include", "this/is/the/basedir/path")
b/include

假设您位于目录分隔符(os.sep)确实是正斜杠的平台上。

此代码尝试将路径处理为比纯粹的字符串更高级别的东西。但这并不是最佳选择,你可以(或应该)做更多的清洁和规范化,以便更安全。

答案 1 :(得分:1)

partition怎么样? 它在第一次出现sep时拆分字符串,并返回包含分隔符之前的部分的3元组,分隔符本身以及分隔符之后的部分。如果找不到分隔符,则返回一个包含字符串本身的3元组,后跟两个空字符串。

data = """this/is/the/basedir/path/a/include
this/is/the/basedir/path/b/include
this/is/the/basedir/path/a
this/is/the/basedir/path/b"""
for line in data.splitlines():
    print line.partition("this/is/the/basedir/path/")[2]

#output
a/include
b/include
a
b

针对作者的新评论进行了更新:
看起来你需要rsplit用于不同的目录,目录是否以“include”not:

结束
import os.path
data = """this/is/the/basedir/path/a/include
this/is/the/basedir/path/b/include
this/is/the/basedir/path/a
this/is/the/basedir/path/b"""
for line in data.splitlines():
    if line.endswith('include'):
        print '/'.join(line.rsplit("/",2)[-2:])
    else:
        print os.path.split(line)[1]
        #or just
        # print line.rsplit("/",1)[-1]
#output
a/include
b/include
a
b

答案 2 :(得分:1)

也许是这样的:

result = []

prefix = os.path.commonprefix(list_of_paths)
for path in list_of_paths:
    result.append(os.path.relpath(path, prefix))

这仅适用于2.6。 2.5和之前的relapath只在路径是当前工作目录时才起作用。

答案 3 :(得分:0)

虽然标准不是100%明确,但从OP的评论中可以看出,关键问题是路径的最后一个组件是否以“include”结尾。如果是这种情况,并避免在最后一个组件出现问题时出错。 “dontinclude”(另一个答案通过尝试字符串匹配而不是路径匹配),我建议:

def lastpart(apath):
    pieces = os.path.split(apath)
    final = -1
    if pieces[-1] == 'include':
        final = -2
    return '/'.join(pieces[final:])