[英]replace part of path - python
有沒有快速替換python中部分路徑的方法?
例如:
old_path='/abc/dfg/ghi/f.txt'
我不知道路徑的開頭 ( /abc/dfg/
),所以我真正想告訴 python 保留/ghi/
之后的所有內容(包括)並將/ghi/
之前的所有內容替換為/jkl/mno/
:
>>> new_path
'/jkl/mno/ghi/f.txt/'
如果您使用的是 Python 3.4+,或者願意安裝backport ,請考慮使用pathlib
而不是os.path
:
path = pathlib.Path(old_path)
index = path.parts.index('ghi')
new_path = pathlib.Path('/jkl/mno').joinpath(*path.parts[index:])
如果您只想堅持使用 2.7 或 3.3 stdlib,則沒有直接的方法可以做到這一點,但是您可以通過循環os.path.split
來獲得等效的parts
。 例如,保留每個路徑組件直到找到第一個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
,然后將它們全部連接在一起,就像使用pathlib
版本一樣。
>>> 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'
您可以使用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'
一種相當幼稚的方法,但可以完成工作:
功能:
def replace_path(path, frm, to):
pre, match, post = path.rpartition(frm)
return ''.join((to if match else pre, match, post))
例子:
>>> s = '/abc/dfg/ghi/f.txt'
>>> replace_path(s, '/ghi/', '/jkl/mno')
'/jkl/mno/ghi/f.txt'
>>> replace_path(s, '/whatever/', '/jkl/mno')
'/abc/dfg/ghi/f.txt'
當您想要替換路徑中的某些已知基本目錄時,以下內容很有用。
from pathlib import Path
old_path = Path('/abc/dfg/ghi/f.txt')
old_root = Path('/abc/dfg')
new_root = Path('/jkl/mno')
new_path = new_root / old_path.relative_to(old_root)
# Result: /jkl/mno/ghi/f.txt
據我所知,OP 特別提到基目錄的路徑未知。 但是,由於刪除基本目錄的路徑是一項常見任務,而且問題的標題(“替換路徑的一部分”)肯定會讓一些人在這里遇到這種問題,所以我還是將其發布。
我需要替換路徑中任意數量的任意字符串,例如用foo替換'package'
VERSION_FILE = Path(f'{Path.home()}', 'projects', 'package', 'package', '_version.py')
所以我用這個電話
_replace_path_text(VERSION_FILE, 'package', 'foo)
def _replace_path_text(path, text, replacement):
parts = list(path.parts)
new_parts = [part.replace(text, replacement) for part in parts]
return Path(*new_parts)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.