解决Python3 UTF-8文件UnicodeDecodeError及字节搜索排序异常
解决方法
核心问题是你之前的处理没有彻底清除所有非UTF-8字节序列,导致输出文件仍存在无法被UTF-8解码的内容。要解决这个问题,需要从字节层面处理输入文件,确保所有非法序列都被替换为合法的UTF-8字符(即"?"),再进行排序和写入。
具体步骤与代码
- 字节级读取与清理:直接以二进制模式读取文件,逐段尝试解码UTF-8,遇到无法解码的字节序列就替换为"?",确保最终得到的字符串完全由合法UTF-8字符组成。
- 基于合法字符串排序:用清理后的字符串排序,避免�这类替换字符干扰排序逻辑。
- 严格UTF-8写入:写入时使用严格的UTF-8编码,确保输出文件无任何非法字节。
# 1. 二进制读取输入文件,彻底清理非UTF-8字节 with open('input.txt', 'rb') as in_file: raw_bytes = in_file.read() decoded_content = [] current_pos = 0 total_bytes = len(raw_bytes) while current_pos < total_bytes: try: # 尝试从当前位置解码尽可能多的合法UTF-8字节 chunk = raw_bytes[current_pos:].decode('utf-8') decoded_content.append(chunk) break # 解码完成,退出循环 except UnicodeDecodeError as e: # 遇到非法字节,替换为"?" decoded_content.append('?') # 跳过当前错误的字节段 current_pos += e.end - e.start # 拼接成完整的合法UTF-8字符串 clean_text = ''.join(decoded_content) # 2. 按需求排序(这里假设按行排序,可根据实际调整) lines = clean_text.splitlines(keepends=True) # 保留换行符 sorted_lines = sorted(lines) # 3. 严格以UTF-8编码写入输出文件 with open('output.txt', 'w', encoding='utf-8', errors='strict') as out_file: out_file.writelines(sorted_lines)
为什么这样有效
- 二进制读取能直接处理所有原始字节,不会遗漏任何非法序列;增量解码确保每个错误字节段都被精准替换。
- 排序基于完全合法的UTF-8字符串,不存在�这类排序位置异常的字符,彻底避免搜索时的判断错误。
- 写入时启用
errors='strict',如果还有非法字符会直接报错,确保输出文件绝对是纯UTF-8格式,后续用encoding='utf-8'读取绝不会抛出UnicodeDecodeError。
内容的提问来源于stack exchange,提问作者Random Guy
相关产品推荐
相关产品推荐

