Is there an easy way to replace a substring within a pathlib.Path
object in Python? The pathlib module is nicer in many ways than storing a path as a str
and using os.path
, glob.glob
etc, which are built in to pathlib
. But I often use files that follow a pattern, and often replace substrings in a path to access other files:
data/demo_img.png
data/demo_img_processed.png
data/demo_spreadsheet.csv
Previously I could do:
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
can replace the file extension with the with_suffix()
method, but only accepts extensions as valid suffixes. The workarounds are:
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"))
Converting to a string to do the replacement and reconverting to a Path
object seems laborious. Assume that I never have a copy of the string form of img_file_path
, and have to convert the type as needed.
Path.replace
as as attempted substitute - not the same thing, and can clobber existing data on filesystem!replace()
will rename the current file to the target, and replace it if the file already exists.