簡體   English   中英

替換部分路徑 - python

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM