Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何替换Python pathlib.Path中的子字符串?_Python_Python 3.x_Pathlib - Fatal编程技术网

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

如何替换Python pathlib.Path中的子字符串?,python,python-3.x,pathlib,Python,Python 3.x,Pathlib,在Python中,有没有一种简单的方法来替换pathlib.Path对象中的子字符串?方法是将路径存储为str并使用os.path、glob.glob等,它们内置于pathlib中。但我经常使用遵循某种模式的文件,并经常替换路径中的子字符串以访问其他文件: data/demo_img.png data/demo_img_processed.png data/demo_spreadsheet.csv 以前我可以做: img_file_path = "data/demo_img.png" proc

在Python中,有没有一种简单的方法来替换
pathlib.Path
对象中的子字符串?方法是将路径存储为
str
并使用
os.path
glob.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"))

转换为字符串进行替换并重新转换为
路径
对象似乎很费劲。假设我从未拥有
img\u file\u path的字符串形式的副本,并且必须根据需要转换类型。

您是正确的。要在路径p中将旧的替换为新的,您需要:

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

编辑

我们将路径p转换为str,从而得到这个str方法:

有关方法\u描述符的帮助:

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

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

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

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

替换(自身、目标)

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


无论您做什么,都要小心使用
Path.replace
作为尝试的替代品-这不是一回事,而且可能会破坏文件系统上的现有数据!这是正确的。幸运的是,我在尝试之前阅读了文档
replace()
将当前文件重命名为目标文件,如果文件已经存在,则将其替换。回答不错。虽然我认为您不需要强制转换为
str
,因此可能没有必要。是的,有必要强制转换为
str
。否则它将调用
pathlib.Path
replace
方法,该方法不会执行相同的操作。