使用StringIO对象列表生成ZipFile,打开ZipFIle时出现CRC错误

问题描述:

我目前在生成带有多行文本的文本文件时遇到了一些困难,并且使用Python 2.7将它添加到内存中的ZipFile中。使用StringIO对象列表生成ZipFile,打开ZipFIle时出现CRC错误

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

如果我将代码“temp [0] .write('first in-in-temp file')”修改为多行字符串,则生成的zip文件将有crc错误。

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

我可以知道我应该怎么做才能生成填充了MultipleLine的文本文件的ZipFile?

在此先感谢。

# 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?尝试打开以二进制方式输出的压缩文件,即

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

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