如何使用 pathlib 切换路径的基础?

How to switch the base of a path using pathlib?

我正在尝试通过删除基础来获取路径的一部分,目前这就是我正在做的:

original = '/tmp/asd/asdqwe/file'
base = '/tmp/asd/'
wanted_part = original.strip(base)

不幸的是,我得到的不是 'asdqwe/file',而是 'qwefile',出于某种原因,strip 工作起来很奇怪,我不明白。

我的问题的最佳解决方案是使用 pathlib.Path,因为我的函数将其属性作为路径获取,而 return 值在添加新的基本路径后将修剪后的字符串转换为路径。 但是如果没有可用的 pathlib 解决方案,一个字符串也很好,目前我正在处理一个奇怪的错误...

您误解了 str.strip 的工作原理。该方法将从目标字符串的 "edges" 中删除参数中指定的所有字符,而不管它们指定的顺序如何:

original = '/tmp/asd/asdqwe/file'
base = '/tmp/asd/'
wanted_part = original.strip(base)
print(wanted_part)
# qwe/file

你想做的可能是切片:

wanted_part = original[len(base):]
print(wanted_part)
# asdqwe/file

或者,使用 pathlib:

from pathlib import Path

original = Path('/tmp/asd/asdqwe/file')
base = Path('/tmp/asd/')

wanted_part = original.relative_to(base)
print(wanted_part)
# asdqwe/file

strip 将删除一系列字符,而不是字符串前缀或后缀,因此它会继续删除您传递的序列中的任何字符。 Instaed,您可以测试原始文件是否以您的基数开头,如果确实如此,则只需获取字符串的剩余字符,即基数长度之后的字符。

original = '/tmp/asd/asdqwe/file'
base = '/tmp/asd/'
if original.startswith(base):
    wanted_part = original[len(base):]
    print(wanted_part)

输出

asdqwe/file