hi I have a string like this:
path = "/level1/level2/level3/file.csv"
I want to do a operation in 2 steps like first is want to replace file name for example
path = "/level1/level2/level3/file_1.csv"
and in some cases only folder which is 2nd last from end like this
path = "/level1/level2/level3_1/file.csv"
so what will be best way to do this ? currently I am doing like this
path.replace('level3','level3_1')
but It got failed when there is same name exist somewhere else in string ...
CodePudding user response:
Use regex to avoid errors with replace()
when 2 same directories are in path.
File
import re
path = "/level1/level2/level3/file.csv"
# get file
file = re.search("[A-Za-z] \.[A-Za-z] ", path).group(0).split(".")
file_name = file[0]
file_type = file[1]
new_path = path.replace(f"{file_name}.{file_type}", "file_2.txt")
print(new_path)
Output
/level1/level2/level3/file_2.txt
Last folder
import re
path = "/level1/level2/level3/file.csv"
# search for file
file = re.search("[A-Za-z] \.[A-Za-z] ", path).group(0)
# to make sure it's last folder, get it with the file
level3_folder = re.search(f"[A-Za-z0-9_ -] /{file}", path).group(0)
# remove the file from folder to rename it
level3_folder = level3_folder.replace(f"/{file}", "")
# rename it
new_path = path.replace(f"{level3_folder}/{file}", f"level3_1/{file}")
print(new_path)
Output
/level1/level2/level3_1/file.csv
CodePudding user response:
a different use of regexp could look like this:
from re import sub
path = "/level1/level2/level3/file.csv"
file_suff = '_1' # '' - for no replacement
dir_suff = '_1' # '' - for no replacement
sub(r'(^.*)/(\w )(\.\w $)',fr'\1{dir_suff}/\2{file_suff}\3',path)
>>> out
'/level1/level2/level3_1/file_1.csv'