假设我的目录路径如下所示:
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
我应该在这里尝试一下,我应该查看一些正则表达式命令,还是可以在没有它的情况下完成?提前谢谢。
编辑全部:我使用正则表达式解决了它,该死的方便工具:)
答案 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:])