关于Python中路径的问题
假设我有如下目录路径:关于Python中路径的问题,python,operating-system,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 result = [] prefix = os.path.commonprefix(list_of_paths) for path in list_of_paths: result.append(os.path.re
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
result = []
prefix = os.path.commonprefix(list_of_paths)
for path in list_of_paths:
result.append(os.path.relpath(path, prefix))
在Python中,如何将这些路径拆分成如下所示:
a/include
b/include
a
b
如果我运行os.path.split(path)[1],它将显示:
include
include
a
b
我应该在这里尝试什么,我应该看看一些regex命令,还是可以不用它?提前谢谢
全部编辑:我用正则表达式解决了它,非常方便的工具:)怎么办?它在第一次出现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
更新作者的新评论:看起来您需要根据“include”的目录结尾是否为不同的目录进行rsplit: 怎么样?
它在第一次出现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
更新作者的新评论:看起来您需要根据“include”的目录结尾是否为不同的目录进行rsplit:
可能类似的情况取决于前缀的硬编码方式:
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
)实际上是正斜杠)
这段代码试图将路径处理为比字符串更高级的内容。虽然这不是最佳选择,但您可以(或应该)进行更多的清理和规范化以确保安全。可能类似的情况取决于前缀的硬编码方式:
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
)实际上是正斜杠)
这段代码试图将路径处理为比字符串更高级的内容。但这并不是最佳选择,您可以(或应该)进行更多的清洁和规范化以更安全。可能类似于:
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
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仅在路径为当前工作目录时才起作用。可能类似于以下内容:
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
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仅在路径为当前工作目录时才起作用。虽然标准不是100%清楚,但从OP的评论来看,关键问题是路径的最后一个组件是否以“include”结尾。如果是这种情况,为了避免最后一个组件为“dontinclude”时出错(另一个答案是尝试字符串匹配而不是路径匹配),我建议:
def lastpart(apath):
pieces = os.path.split(apath)
final = -1
if pieces[-1] == 'include':
final = -2
return '/'.join(pieces[final:])
虽然标准不是100%清楚,但从OP的评论来看,关键问题是路径的最后一个组件是否以“include”结尾。如果是这种情况,为了避免最后一个组件为“dontinclude”时出错(另一个答案是尝试字符串匹配而不是路径匹配),我建议:
def lastpart(apath):
pieces = os.path.split(apath)
final = -1
if pieces[-1] == 'include':
final = -2
return '/'.join(pieces[final:])
现在还不清楚你是如何决定在哪里分割路径的。例如,您希望如何处理某些/other/basedir/和/stuff/that/I/include?不清楚您如何确定在何处分割路径。例如,您希望如何处理某些/other/basedir/和/stuff/that/I/include?