2017-10-14 4 views
0

Ich stehe derzeit vor der Schwierigkeit, eine Textdatei mit mehreren Textzeilen zu erzeugen und sie mit Python 2.7 zu einer ZipFile im Speicher hinzuzufügen.ZipFile mit einer Liste von StringIO-Objekten generieren, CRC-Fehler beim Öffnen der ZipFIle

Der folgende Code ist in der Lage, ZIP-Datei mit 4 Textdatei zu generieren, jede Datei hat 1 Zeile von Wörtern.

Wenn ich den Code "temp [0] .write ('erste speicherinterne temporäre Datei')" in mehrere Zeilen ändern, hat die generierte ZIP-Datei einen CRC-Fehler.

Ich habe String Escape versucht, aber es ist fehlgeschlagen.

Darf ich wissen, was ich tun soll, um das Zipfile zu erstellen, das mit MultipleLine-fähiger Textdatei gefüllt ist?

Vielen Dank im Voraus.

# 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()) 

Antwort

1

Ich vermute, dass Sie Windows verwenden? Versuchen, die Ausgabe Zip-Datei im Binärmodus zu öffnen, das heißt

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

Im Textmodus (der Standard) Python wandelt neue Linien (‚\ n‘) zu der nativen Linie Endsequenz, die \r\n in Windows ist. Dies führt dazu, dass der CRC fehlschlägt, da der CRC anhand der Daten im Puffer StringIO berechnet wird. Die Daten werden jedoch geändert (\n wird in \r\n konvertiert), wenn sie in die Textmodusdatei geschrieben werden.

Verwandte Themen