Python对比文本文件时出现charmap编码UnicodeDecodeError如何解决
报错诱因
这个错误是文本解码失败导致的,具体原因如下:
- Windows系统下Python的
open()函数默认使用系统本地编码(通常是GBK/CP1252这类字符映射编码)打开文本文件 - 你要读取的txt文件是用UTF-8(或其他非系统默认编码)保存的,文件中包含了默认编码无法识别的字节序列(报错中提到的
0x9d),导致解码抛出异常 - 如果你要比对的文件本身是非文本类二进制文件,用文本模式读取本身就会触发解码错误
修复方案
可根据你的使用场景二选一:
场景1:确认两个文件都是文本文件
给open()函数显式指定文件对应的编码(最常见的是utf-8,如果你的文件是其他编码替换成对应值即可),修改后代码如下:
path = r"D:\Python_Course_with_Notes[1]\9. Chapter 9\ok.txt" path2 = r"D:\Python_Course_with_Notes[1]\9. Chapter 9\this.txt" # 显式指定编码为utf-8 with open(path, encoding='utf-8') as f: check = f.read() with open(path2, encoding='utf-8') as f: to_check = f.read() if check == to_check: print("Yes this file matches with another file") else: print("No this file doesn't matches with another file")
如果指定utf-8后仍然报错,可以根据文件实际编码替换为gbk、utf-8-sig等适配值。
场景2:任意格式文件通用比对方案(更推荐,无编码问题)
直接用二进制模式读取文件内容,不需要解码为字符串,直接比对字节序列即可,既不会触发编码错误,也可以支持图片、压缩包等任意格式文件的一致性校验,修改后代码如下:
path = r"D:\Python_Course_with_Notes[1]\9. Chapter 9\ok.txt" path2 = r"D:\Python_Course_with_Notes[1]\9. Chapter 9\this.txt" # 用rb表示二进制只读模式打开 with open(path, 'rb') as f: check = f.read() with open(path2, 'rb') as f: to_check = f.read() if check == to_check: print("Yes this file matches with another file") else: print("No this file doesn't matches with another file")
内容的提问来源于stack exchange,提问作者Pranshu2OP
相关产品推荐
相关产品推荐

