问题描述
import lzma
myData = ("12+34+113+32+81+92+27...").encode()
obj = lzma.LZMAFile(filename,mode="wb")
obj.write(myData)
obj.close()
然后我尝试将其打开
obj = lzma.LZMAFile(filename,mode="rb")
data = obj.read()
但是我得到UnicodeDecodeError:'utf-8'编解码器无法解码位置0的字节0xfd:无效的起始字节
为什么没有错误编码却有错误解码? 我尝试压缩字符串以节省字节。
解决方法
从第50行开始,以二进制模式创建一个LZMA压缩文件,其位置参数等于filename=mode,mode="wb"
:
if compression and verbose:
print("Encoding and compress...")
aux = (aux[:-1]).encode("utf-8")
obj = lzma.LZMAFile(mode,"wb")
print("Writing to file")
obj.write(aux)
obj.close()
return 0
然后将aux
类型的bytes
写入LZMA压缩文件。
从第121行开始,您用3个位置参数调用lzma.open()
,documentation显示无效。您最多可以有2个位置参数,然后必须使用关键字参数指定其他所有内容。除此之外,r+b
没有列出为mode
参数的有效值。该文档指出:
对于二进制模式,模式参数可以是“ r”,“ rb”,“ w”,“ wb”,“ x”,“ xb”,“ a”或“ ab”中的任何一个,或“ rt”, “ wt”,“ xt”或“ at”表示文本模式。默认值为“ rb”。
if compression:
print("Staring decompression...")
with lzma.open(files[i],"r+b","utf-8") as lzmaFile:
# obj = lzma.LZMAFile(files[i],mode="r")
fContent = lzmaFile.read()
最初写入lzma文件时,您编写了bytes
对象。读取lzma文件时,您再次获得相同的bytes
对象。要获取原始的str
,请调用decode()
对象的bytes
方法,并使用与该对象相同的编码(在这种情况下为utf-8
)。
if compression:
print("Staring decompression...")
with lzma.open(files[i]) as f:
uncompressed_str = f.read().decode("utf-8")