21

有没有一种简单的方法可以pathlib.Path在 Python 中替换对象中的子字符串?pathlib模块在很多方面都比将路径存储为 astr和 usingos.pathglob.glob(内置于pathlib. 但是我经常使用遵循模式的文件,并且经常替换路径中的子字符串来访问其他文件:

data/demo_img.png
data/demo_img_processed.png
data/demo_spreadsheet.csv

以前我可以这样做:

img_file_path = "data/demo_img.png"
proc_img_file_path = img_file_path.replace("_img.png", "_img_proc.png")
data_file_path = img_file_path.replace("_img.png", "_spreadsheet.csv")

pathlib可以用方法替换文件扩展名with_suffix(),但只接受扩展名作为有效的后缀。解决方法是:

import pathlib
import os


img_file_path = pathlib.Path("data/demo_img.png")
proc_img_file_path = pathlib.Path(str(img_file_path).replace("_img.png", "_img_proc.png"))
# os.fspath() is available in Python 3.6+ and is apparently safer than str()
data_file_path = pathlib.Path(os.fspath(img_file_path).replace("_img.png", "_img_proc.png"))

转换为字符串进行替换并重新转换为Path对象似乎很费力。假设我从来没有 的字符串形式的副本img_file_path,并且必须根据需要转换类型。

4

3 回答 3

31

你是对的。要在路径 p 中用新替换旧,您需要:

p = Path(str(p).replace(old, new))

编辑

我们把 Path p 变成 str 所以我们得到这个 str 方法:

关于method_descriptor的帮助:

替换(自我,旧的,新的,计数=-1,/)

返回所有出现的子字符串 old 替换为 new 的副本。

否则我们会得到这个 Path 方法:

模块 pathlib 中函数替换的帮助:

替换(自我,目标)

将此路径重命名为给定路径,如果存在则破坏现有目的地,并返回一个指向给定路径的新 Path 实例。

于 2018-11-20T21:42:03.873 回答
0

我最近遇到了类似的问题,在寻找解决方案时发现了这个线程。与接受的答案相反,我没有将pathlib.Path对象转换为字符串。相反,我使用了它的parentname属性(name本身就是一个字符串)以及joinpath()方法。这是代码:

In [2]: from pathlib import Path

In [3]: img_file_path = Path('data/demo_img.png')

In [4]: parent, name = img_file_path.parent, img_file_path.name

In [5]: proc_fn = name.replace('_img.png', '_img_proc.png')
   ...: data_fn = name.replace('_img.png', '_spreadsheet.csv')

In [6]: proc_img_file_path = Path(parent).joinpath(proc_fn)
   ...: data_img_file_path = Path(parent).joinpath(data_fn)

In [7]: proc_img_file_path
Out[7]: WindowsPath('data/demo_img_proc.png')

In [8]: data_img_file_path
Out[8]: WindowsPath('data/demo_spreadsheet.csv')

这种方法的一个优点是它避免了在父位中进行不需要的替换的风险。

于 2021-08-19T22:52:22.643 回答
0

使用 PurePath.with_name() 或 PurePath.with_stem()

于 2021-12-12T10:25:58.327 回答