将zlib压缩的utf8数据写入文件

时间:2015-02-02 08:07:19

标签: python utf-8 zlib

我有一个文件,其数据以utf-8编码。我想读取数据,删除空格,用换行符分隔单词,压缩整个内容并将它们写入文件。这就是我想要做的事情:

with codecs.open('1020104_4.utf8', encoding='utf8', mode='r') as fr :
    data = re.split(r'\s+',fr.read().encode('utf8'))
    #with codecs.open('out2', encoding='utf8', mode='w') as fw2 :
        data2 = ('\n'.join(data)).decode('utf8')
        data3 = zlib.compress(data2)
        #fw2.write(data3)

但是我收到错误:

Traceback (most recent call last):
    File "tmp2.py", line 17, in <module>
        data3 = zlib.compress(data2)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 47-48: ordinal not in range(128)

如何将此数据写入文件?

1 个答案:

答案 0 :(得分:1)

我认为你的encoding-foo只是错误的方式,在Python 3中这将更加清晰☺。

首先,在拆分时,您希望在已解码的数据上执行此操作,即在您使用read时已从codecs.open获取的Unicode字符串上执行此操作,因此第一行应该是

data = re.split(r'\s+', fr.read())

因此,在将数据传递给zlib之前,您希望通过编码将其转换为bytes

data2 = ('\n'.join(data)).encode('utf8')
data3 = zlib.compress(data2)

在最后一步中,您要将其写入二进制文件句柄:

with open("output", "wb") as fw:
    fw.write(data3)

您可以使用gzip模块来缩短这一点:

with codecs.open('1020104_4.utf8', encoding='utf8', mode='r') as fr:
    data = re.split(r'\s+', fr.read())
    with gzip.open('out2', mode='wb') as fw2 :
        data2 = ('\n'.join(data)).encode('utf8')
        fw2.write(data2)