生成带有字符串IO对象列表的Zip文件,打开ZipFIle时CRC错误



我目前在生成具有多行文本的文本文件并将其添加到使用 Python 2.7 的内存中的 ZipFile 时遇到了一些困难。

下面的代码能够生成带有4个文本文件的zip文件,每个文件有1行单词。

如果我将代码"temp[0].write('第一个内存中临时文件')"修改为多行字符串,生成的 zip 文件将出现 crc 错误。

我尝试过字符串转义,但失败了。

我可以知道我应该怎么做才能生成填充了启用多行的文本文件的 Zip文件吗?

# coding: utf-8
import StringIO
import zipfile
# This is where my zip will be written
buff = StringIO.StringIO()
# This is my zip file
zip_archive = zipfile.ZipFile(buff, mode='w')
temp = []
for i in range(4):
    # One 'memory file' for each file 
    # I want in my zip archive
    temp.append(StringIO.StringIO())
# Writing something to the files, to be able to
# distinguish them
temp[0].write('first in-memory temp file')
temp[1].write('second in-memory temp file')
temp[2].write('third in-memory temp file')
temp[3].write('fourth in-memory temp file')
for i in range(4):
    # The zipfile module provide the 'writestr' method.
    # First argument is the name you want for the file
    # inside your zip, the second argument is the content
    # of the file, in string format. StringIO provides
    # you with the 'getvalue' method to give you the full
    # content as a string
    zip_archive.writestr('temp'+str(i)+'.txt',
                         temp[i].getvalue())
# Here you finish editing your zip. Now all the information is
# in your buff StringIO object
zip_archive.close()
# You can visualize the structure of the zip with this command
print zip_archive.printdir()
# You can also save the file to disk to check if the method works
with open('test.zip', 'w') as f:
    f.write(buff.getvalue())

我猜你使用的是Windows?尝试以二进制模式打开输出 zip 文件,即

with open('test.zip', 'wb') as f:
    f.write(buff.getvalue())

在文本模式(默认)中,Python 将新行 ('') 转换为本机行结束序列,这在 Windows 中rn。这将导致CRC失败,因为CRC是使用StringIO缓冲区中的数据计算的,但是当写入文本模式文件时,数据会被更改(n转换为rn)。

相关内容

最新更新