用字典批量替换文本文件ASCII为Unicode字符失败,求解决方案
问题:多键字典字符替换失效,仅单键时生效
我写了个Python函数,想读取文本文件把一批字符替换成对应Unicode字符,但只要字典里超过一项,就完全替换不了,只有留一项时才正常。调试一整天没解决。
原代码
import re match = { # 原字典有100多项 "᾿Ι" : "Ἰ", "᾿Α" : "Ἀ", "´Α" : "Ά", "`Α" : "Ὰ", "᾿Α" : "Ἀ", "᾿Ρ" : "ῤ", "῾Ρ" : "Ῥ" } with open("file.txt", "r", encoding="utf-8") as file, open("OUT.txt", "w", encoding="utf-8") as newfile: def replace_all(text, dict): for i, j in dict.items(): result, count = re.subn(r"%s" % i, j, str(text)) return result, count # 执行替换 string = file.read() result, count = replace_all(string, match) # 写入结果 newfile.write(result) print("Changes: " + str(count))
待处理文本示例
Βίβλος γενέσεως ᾿Ιησοῦ Χριστοῦ, υἱοῦ Δαυῒδ, υἱοῦ ᾿Αβραάμ.
其中᾿Ι和᾿Α需要分别替换为Ἰ和Ἀ。
解决方案
问题根源
- 替换未累积:每次循环都用原始
text做替换,而非上一次替换后的结果,最后只保留了最后一个键的替换效果,前面的全白做了。 - 计数错误:返回的
count只是最后一次替换的次数,不是所有替换的总和。 - 字典重复键:
match里"᾿Α"出现两次,字典键唯一,后面的会覆盖前面的,导致冗余且可能混淆。 - 不必要的类型转换:
str(text)完全多余,因为传入的text已经是字符串。
修正后的代码
import re # 移除重复键,确保每个键唯一 match = { "᾿Ι" : "Ἰ", "᾿Α" : "Ἀ", "´Α" : "Ά", "`Α" : "Ὰ", "᾿Ρ" : "ῤ", "῾Ρ" : "Ῥ" } def replace_all(text, replace_dict): # 初始化结果为原始文本,总计数为0 result = text total_count = 0 for old_str, new_str in replace_dict.items(): # 用上一次的结果继续替换,转义特殊字符避免正则解析错误 result, count = re.subn(re.escape(old_str), new_str, result) total_count += count return result, total_count with open("file.txt", "r", encoding="utf-8") as file, open("OUT.txt", "w", encoding="utf-8") as newfile: string = file.read() result, total_count = replace_all(string, match) newfile.write(result) print(f"Changes: {total_count}")
关键改进点
- 用
result = text初始化,每次迭代基于上一次的替换结果继续处理,保证所有替换都生效。 - 新增
total_count累加每次替换的次数,最终返回总替换数。 - 用
re.escape(old_str)转义特殊字符(比如字典里的᾿、´等),避免正则表达式解析错误。 - 移除字典重复键,避免不必要的覆盖。
- 把函数定义移到
with语句外,符合代码规范。
内容的提问来源于stack exchange,提问作者Lavonen
相关产品推荐
相关产品推荐

