有没有快速的方法来替换python中的部分路径?
例如:
old_path='/abc/dfg/ghi/f.txt'
我不知道路径的开头(/abc/dfg/
),所以我真的想告诉python保留/ghi/
之后的所有内容(包括)并替换/ghi/
之前的所有内容{1}} /jkl/mno/
:
>>> new_path
'/jkl/mno/ghi/f.txt/'
答案 0 :(得分:9)
如果您使用的是Python 3.4+,或者愿意安装backport,请考虑使用pathlib
代替os.path
:
path = pathlib.Path(old_path)
index = p.parts.index('ghi')
new_path = pathlib.Path('/jkl/mno').joinpath(*p.parts[index:])
如果您只想坚持使用2.7或3.3 stdlib,那么没有直接方法可以做到这一点,但是您可以通过循环{{1}来获得等效的parts
}。例如,保留每个路径组件,直到找到第一个os.path.split
,然后添加新的前缀,将替换最后一个ghi
之前的所有内容(如果要在之前替换所有内容) ghi
,改变事情并不难:
ghi
这有点笨拙,所以您可能要考虑编写一个简单的函数,为您提供路径组件的列表或元组,这样您就可以使用path = old_path
new_path = ''
while True:
path, base = os.path.split(path)
new_path = os.path.join(base, new_path)
if base == 'ghi':
break
new_path = os.path.join('/jkl/mno', new_path)
,然后将它们全部重新组合在一起,如使用find
版本。
答案 1 :(得分:5)
>>> import os.path
>>> old_path='/abc/dfg/ghi/f.txt'
首先使用os.path.relpath
>>> rel = os.path.relpath(old_path, '/abc/dfg/')
>>> rel
'ghi\\f.txt'
然后使用os.path.join
>>> new_path = os.path.join('jkl\mno', rel)
>>> new_path
'jkl\\mno\\ghi\\f.txt'
答案 2 :(得分:1)
您可以使用ghi
的索引:
old_path.replace(old_path[:old_path.index("ghi")],"/jkl/mno/")
In [4]: old_path.replace(old_path[:old_path.index("ghi")],"/jkl/mno/" )
Out[4]: '/jkl/mno/ghi/f.txt'
答案 3 :(得分:0)
一种相当幼稚的方法,但是做的是:
功能:
def replace_path(path, frm, to):
pre, match, post = s.rpartition(frm)
return ''.join((to if match else pre, match, post))
示例:
>>> replace_path(s, '/ghi/', '/jkl/mno')
'/jkl/mno/ghi/f.txt'
>>> replace_path(s, '/whatever/', '/jkl/mno')
'/abc/dfg/ghi/f.txt'