繁体   English   中英

如何替换 Python pathlib.Path 中的子字符串?

[英]How can I replace a substring in a Python pathlib.Path?

有没有一种简单的方法可以替换 Python 中pathlib.Path对象中的子字符串? pathlib 模块在很多方面都比将路径存储为str并使用os.pathglob.globglob.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的字符串形式的img_file_path ,并且必须根据需要转换类型。

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

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

编辑

我们将 Path p 转换为 str 所以我们得到了这个 str 方法:

关于 method_descriptor 的帮助:

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

返回一个副本,其中所有出现的子字符串 old 都被 new 替换。

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

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

替换(自我,目标)

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

我最近遇到了类似的问题,并在寻找解决方案时发现了这个线程。 与接受的答案相反,我没有将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')

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM