Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于Python中路径的问题_Python_Operating System - Fatal编程技术网

关于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?