代码之家  ›  专栏  ›  技术社区  ›  Avisek

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

  •  2
  • Avisek  · 技术社区  · 10 年前

    我有一个用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 回复  |  直到 10 年前
        1
  •  1
  •   filmor    10 年前

    我认为你对foo的编码方式是错误的,在Python3中这会更加清晰。

    首先,拆分时,您希望在 已解码的 数据,即Unicode字符串,您已经从 read 因为您正在使用 codecs.open ,所以第一行应该是

    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)