Python处理含多种编码的网页文件时写入失败如何解决?
混合编码网页文件读写修改解决方案
问题根因
你遇到的报错核心是单一编码规则无法兼容网页中同时存在的UTF-8明文、URL编码(你提到的%开头的内容属于URL编码,不是Unicode escape)两类内容,固定单一编码读写时会出现解码/编码失败的问题,另外原代码中逐行循环反复打开关闭写入文件,也容易触发IO冲突导致写入失败。
最优解决方案
优先选择二进制读写方案,完全跳过编码解码步骤,直接对字节内容做替换,100%兼容原文件的所有编码格式,不会出现乱码或写入失败问题。
方案1:二进制读写(保留原文件所有编码格式,推荐)
write_name = 'advisor_appendices111.htm' file_name = 'advisor_appendices.htm' # 待替换的目标字符串转成字节串,和读取的二进制内容格式匹配 target_bytes = '../../%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9/documentation/'.encode('utf-8') with open(file_name, "rb") as f: content = f.read() # 跳过第一行的处理 first_line_end = content.find(b'\n') + 1 content = content[first_line_end:] # 字节串替换 content = content.replace(target_bytes, b'') # 直接写入二进制内容,完全保留原编码 with open(write_name, "wb") as fpw: fpw.write(content)
方案2:统一转码为UTF-8(适合需要统一编码格式的场景)
如果需要把所有内容转成统一的UTF-8编码,可以先对内容做URL解码后再处理:
from urllib.parse import unquote write_name = 'advisor_appendices111.htm' file_name = 'advisor_appendices.htm' with open(file_name, "rb") as f: raw_content = f.read() # 解码为字符串,忽略无法解码的异常字符 str_content = raw_content.decode('utf-8', errors='ignore') # 解URL编码,将%XX格式内容转为正常明文 str_content = unquote(str_content) # 跳过第一行 str_content = '\n'.join(str_content.splitlines()[1:]) # 替换明文路径 str_content = str_content.replace('../../新建文件夹/documentation/', '') # 统一用UTF-8编码写入 with open(write_name, "w", encoding="utf-8") as fpw: fpw.write(str_content)
注意事项
- 读写文件优先使用
with语法,会自动处理文件关闭,避免IO资源泄漏 - 不需要逐行读写,一次性读取全量内容处理效率更高,也不会出现行截断导致的替换失效问题
内容的提问来源于stack exchange,提问作者米肖雄
相关产品推荐
相关产品推荐

