Hap*_*yPy 4 python replace path
有没有快速的方法来替换python中的部分路径?
例如:
old_path='/abc/dfg/ghi/f.txt'
Run Code Online (Sandbox Code Playgroud)
我不知道路径(年初/abc/dfg/),所以我真的很想告诉Python保持后到来的一切/ghi/(含),并取代一切之前/ghi/有/jkl/mno/:
>>> new_path
'/jkl/mno/ghi/f.txt/'
Run Code Online (Sandbox Code Playgroud)
aba*_*ert 10
如果您使用的是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:])
Run Code Online (Sandbox Code Playgroud)
如果你只想坚持使用2.7或3.3 stdlib,那么没有直接的方法可以做到这一点,但是你可以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)
Run Code Online (Sandbox Code Playgroud)
这有点笨拙,所以您可能要考虑编写一个简单的函数,为您提供路径组件的列表或元组,这样您就可以使用find,然后将它们全部重新连接在一起,就像pathlib版本一样.
您可以使用以下索引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'
Run Code Online (Sandbox Code Playgroud)
>>> import os.path
>>> old_path='/abc/dfg/ghi/f.txt'
Run Code Online (Sandbox Code Playgroud)
首先从您选择的起始目录中获取相对路径 os.path.relpath
>>> rel = os.path.relpath(old_path, '/abc/dfg/')
>>> rel
'ghi\\f.txt'
Run Code Online (Sandbox Code Playgroud)
然后使用将新路径的第一部分添加到此相对路径 os.path.join
>>> new_path = os.path.join('jkl\mno', rel)
>>> new_path
'jkl\\mno\\ghi\\f.txt'
Run Code Online (Sandbox Code Playgroud)
当您想要替换路径中的某些已知基本目录时,以下内容很有用。
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
Run Code Online (Sandbox Code Playgroud)
据我所知,OP 特别提到基本目录的路径未知。然而,由于删除基本目录的路径是一项常见任务,并且问题的标题(“替换部分路径”)肯定会让一些人在这里遇到这种子类型的问题,所以我无论如何都会发布它。
| 归档时间: |
|
| 查看次数: |
12371 次 |
| 最近记录: |