如何使用7ziplzma在python中读取utf-8编码的文件

问题描述

我正在使用以下文件压缩文件

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")