使用 StringIO 对象列表生成 ZipFile,打开 ZipFIle 时出现 CRC 错误
Generating ZipFile with List of StringIO Object, CRC Error when Opening the ZipFIle
我目前在使用 Python 2.7 生成包含多行文本的文本文件并将其添加到内存中的 ZipFile 时遇到了一些困难。
下面的代码能够生成包含 4 个文本文件的 zip 文件,每个文件有 1 行文字。
如果我修改代码“temp[0].write('first in-memory 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?尝试以二进制模式打开输出 zip 文件,即
with open('test.zip', 'wb') as f:
f.write(buff.getvalue())
在文本模式下(默认)Python 将新行 ('\n') 转换为本机行结束序列,即 Windows 中的 \r\n
。这将导致 CRC 失败,因为 CRC 是使用 StringIO
缓冲区中的数据计算的,但是在写入文本时数据随后被更改(\n
被转换为 \r\n
)模式文件。
我目前在使用 Python 2.7 生成包含多行文本的文本文件并将其添加到内存中的 ZipFile 时遇到了一些困难。
下面的代码能够生成包含 4 个文本文件的 zip 文件,每个文件有 1 行文字。
如果我修改代码“temp[0].write('first in-memory 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?尝试以二进制模式打开输出 zip 文件,即
with open('test.zip', 'wb') as f:
f.write(buff.getvalue())
在文本模式下(默认)Python 将新行 ('\n') 转换为本机行结束序列,即 Windows 中的 \r\n
。这将导致 CRC 失败,因为 CRC 是使用 StringIO
缓冲区中的数据计算的,但是在写入文本时数据随后被更改(\n
被转换为 \r\n
)模式文件。