我想在python中的"映射列表"的帮助下规范化文件名。
例如,我有一些文件命名如下:
Abb. 1 - Streßfaktor ìmpersóna.jpg
Abb. 2 - Änderungsverlauf.jpg
Abb. 3 — Senôjarîolé.jpg
我的目标是得到这个:
Abb_1_Stressfaktor_impersona.jpg
Abb_2_Aenderungsverlauf.jpg
Abb_3_Senojariole.jpg
规则非常简单,可以存储在带有正则表达式的"映射列表"中:
"s+|.|,|;|-|–|—" : "_"
"ß" : "ss"
"ä" : "ae"
"ü" : "ue"
"ö" : "oe"
"á|â|à|ā|ă|ą|ã|å" : "a"
"í|í|ì|ï|ĩ|ī|ĭ|į|ǐ" : "i"
"_+" : "_"
因此,在:
之前有正则表达式中的搜索字符串,在:
之后有替换字符串。
我已经尝试过:
import os
current_path = os.getcwd()
print('Current path: %s' %current_path)
filenames = os.listdir(current_path)
for filenamen in filnames:
os.rename(filename, filename.replace(" ", "_"))
os.rename(filename, filename.replace(".", "_"))
os.rename(filename, filename.replace(",", "_"))
os.rename(filename, filename.replace(";", "_"))
os.rename(filename, filename.replace("-", "_"))
os.rename(filename, filename.replace("–", "_"))
os.rename(filename, filename.replace("—", "_"))
os.rename(filename, filename.replace("ß", "ss"))
os.rename(filename, filename.replace("ä", "ae"))
os.rename(filename, filename.replace("ü", "ue"))
os.rename(filename, filename.replace("ö", "o"))
os.rename(filename, filename.replace("á", "a"))
os.rename(filename, filename.replace("â", "a"))
os.rename(filename, filename.replace("à", "a"))
…
但是这段代码的问题是,一旦进行了第一次替换,我就会得到FileNotFoundError,这是合乎逻辑的:文件名已更改,因此"原始"文件不再存在。
我已经搜索了一个带有"映射列表"的解决方案,但我没有找到任何方便来实现给定目标的东西。
有人知道如何解决这个问题吗?
如果你在每次替换后不调用os.rename
(只需在临时变量中分配replace
方法的结果(,你的方法应该有效,例如:
filenames = os.listdir(current_path)
new_name = ""
for filename in filenames:
new_name = filename.replace(".", "_").replace(",", "_") # ...
os.rename(filename, new_name)
您还可以将替换存储在字典中,并在嵌套循环中应用它们,例如(使用正则表达式(:
replacements = {
"ß": "ss",
"ä": "ae",
# ...
}
filenames = os.listdir(current_path)
new_name = ""
for filename in filenames:
new_name = filename
for key, value in replacements.items():
new_name = re.sub(key, value, new_name)
os.rename(filename, new_name)
本答案显示了使用正则表达式一次执行所有替换的替代方法。