如何在文件处理中同时执行字符串替换与re.sub正则替换?
解决CSV转XML时的正则替换整合问题
你可以通过两种方式把正则替换整合到你的转换流程里,下面分别说明:
方法一:在逐行处理时直接应用正则(推荐)
既然你是逐行读取CSV并处理,最高效的方式就是在完成所有字符串替换后,立刻对当前行应用正则替换,再写入XML文件。这样不需要额外读写文件,内存占用也小,适合处理大文件。
修改你的代码如下:
import re # 用with语句自动管理文件,无需手动close with open("input.csv", "r") as text, open("output.xml","w") as x: for line in text: # 先执行所有字符串替换 processed_line = line.replace("QWERT=", "<Doc3045 QWERT=\"") \ .replace(",Date=", "\" Date=\"") \ .replace("ABCDE,Tp,CD", "") \ .replace("S,1,", "<Cli Tp=\"1\" ABCDE=\"S\" Cd=\"") \ .replace(",", "\"/>") # 应用正则替换处理行尾的数字 processed_line = re.sub(r'(\d$)', r'\1"/>', processed_line) # 将最终处理后的行写入文件 x.write(processed_line)
为什么这样可行?
你的正则re.sub(r'(\d$)', r'\1"/>', line)是用来匹配行尾的数字,并在其后方添加闭合标签"/>。把它放在所有字符串替换之后,能确保之前的替换操作不会干扰正则的匹配逻辑,同时每一行处理完就直接写入,避免了后续重复读写文件的开销。
方法二:事后处理输出文件(适合小文件)
如果因为某些原因你想先完成所有字符串替换写入文件,再单独执行正则替换,可以重新打开输出文件,读取全部内容后做替换,再写回文件。不过这种方法需要把整个文件加载到内存,不适合大文件。
示例代码:
import re # 第一步:完成初始字符串替换并写入文件 with open("input.csv", "r") as text, open("output.xml","w") as x: for line in text: processed_line = line.replace("QWERT=", "<Doc3045 QWERT=\"") \ .replace(",Date=", "\" Date=\"") \ .replace("ABCDE,Tp,CD", "") \ .replace("S,1,", "<Cli Tp=\"1\" ABCDE=\"S\" Cd=\"") \ .replace(",", "\"/>") x.write(processed_line) # 第二步:读取输出文件并执行正则替换 with open("output.xml", "r+") as f: content = f.read() updated_content = re.sub(r'(\d$)', r'\1"/>', content, flags=re.MULTILINE) # 回到文件开头,写入更新后的内容并截断多余部分 f.seek(0) f.write(updated_content) f.truncate()
注意这里要加上flags=re.MULTILINE,让$匹配每一行的结尾,而不是整个文件的结尾。
小提示
建议优先使用方法一,不仅效率更高,也更符合逐行处理的逻辑。处理完后可以打开输出的XML文件检查标签是否都正确闭合,确保格式符合要求。
内容的提问来源于stack exchange,提问作者Adami
相关产品推荐
相关产品推荐

