Python字符串UTF-32编解码异常求助:文件读写后字节重复报错
解决UTF-32编码解码的文件读写问题
我来帮你搞定这个问题!你的核心问题出在编码后写入文件的方式错误——你把UTF-32编码后的字节对象转成了字符串(也就是把b'\xff\xfe...'这种文本形式写进了文件),而不是直接写入原始字节。这就导致解码时读取的不是真正的UTF-32字节流,而是字节对象的字符串表示,自然触发解码错误。
问题拆解
看你的encode函数:
def encode(filename): s = readfile(filename) s_enc = bytes(s, 'utf-32') writefile(filename, str(s_enc)) # 这里错了!把bytes的字符串表示写入了文件
str(s_enc)会把字节对象转换成类似b'\xff\xfe\x00\x00H\x00...'的字符串,写入文件后,文件里存的是这段文本,而不是UTF-32的原始字节。后续用readfile_b读取时,得到的是这段文本的字节,自然无法用UTF-32解码。
修正后的代码
我们需要调整文件读写的模式,直接操作字节流,同时用with语句简化文件操作(自动关闭文件,更安全):
def read_text(filename): # 读取文本文件(默认utf-8,可根据需要调整) with open(filename, 'r', encoding='utf-8') as f: return f.read() def read_bytes(filename): # 读取二进制文件 with open(filename, 'rb') as f: return f.read() def write_text(filename, content): # 写入文本文件 with open(filename, 'w', encoding='utf-8') as f: f.write(content) def write_bytes(filename, content): # 写入二进制文件 with open(filename, 'wb') as f: f.write(content) def encode(filename): # 读取原始文本,编码为UTF-32字节,写入二进制文件 s = read_text(filename) s_enc = s.encode('utf-32') # 等价于bytes(s, 'utf-32'),写法更直观 write_bytes(filename, s_enc) def decode(filename): # 读取UTF-32字节,解码为文本,写入文本文件 s_enc = read_bytes(filename) s = s_enc.decode('utf-32') write_text(filename, s) # 测试执行 encode("Example.txt") decode("Example.txt")
关键修改点
- 编码阶段:用
write_bytes(二进制模式wb)直接写入UTF-32编码后的字节,不再转成字符串。 - 解码阶段:用
read_bytes(二进制模式rb)读取原始字节,直接调用decode('utf-32')还原字符串。 - 用
with语句管理文件,避免手动关闭文件可能出现的遗漏或错误。 - 函数命名更清晰,明确区分文本和字节操作,降低混淆。
验证效果
假设Example.txt初始内容是Hello:
encode后,文件会被替换为UTF-32编码的原始字节(比如小端序的话,开头是\xff\xfe\x00\x00,后面跟着每个字符的4字节表示)。decode后,文件会被还原为原始的Hello文本。
内容的提问来源于stack exchange,提问作者Kai
相关产品推荐
相关产品推荐

