我有一个表示文件完整路径的字符串:
full_path = '/home/user/fold1/fold2/sub-fold/'
我需要从这个字符串中删除存储在不同变量中的根路径:
root = '/home/user/fold1/'
结果路径应该如下所示:
new_path = 'fold2/sub-fold/'
当我的代码遍历存储在许多不同位置的许多文件时,完整路径(显然是根路径)不断变化。
这是我之后的(不存在的)操作:
new_path = full_path - root
我该怎么做?
答案 0 :(得分:5)
对于路径操作,最好使用os.path:
import os
new_path = os.path.relpath(full_path, root)
FTR:字符串的-
运算符相当于string.replace(),但正如其他人所指出的那样,它将替换所有出现的字符串,而不仅仅是在开头:
new_path = full_path.replace(root, '')
答案 1 :(得分:2)
如果您确信full_path确实以root开头,则可以通过索引使用简单的子字符串:
new_path = full_path[len(root):]
如果您不信任它,您可以先进行if-test检查,如果不符合预期则采取适当的措施。
答案 2 :(得分:2)
您可以删除与根长度匹配的开头(bgoldst'答案):
path[len(root):]
但是你不会注意到那个开头是否与你期望的根不匹配。例如,如果您将/bla/foo
作为root
和/bar/zap/fong/tang
作为文件,那么您将获得/fong/tang
,从而有效地隐藏了前一个错误。我不建议那样做。
严格替换给定root
中的字符串path
(Aprillion' s)也可以取代以后的事件,有效地返回废话,正如评论指出的那样。
我建议正确替换字符串的开头:
import re
result = re.sub(r'^' + re.escape(root), '', path)
这样可以避免陷阱。
您可能还想考虑使用os.path.relpath()
根据文件系统逻辑从路径中删除给定的开头。
在任何情况下,您应该考虑在给定的根与路径的开头不匹配的情况下程序应该如何表现。我提出的re
解决方案将不会改变给定的路径。在大多数情况下,这将是一种有用的行为,但肯定不是在所有情况下。