Python使用io.BytesIO创建Zip文件损坏问题求助
问题原因与修复方案
问题根源
你用io.BytesIO()生成Zip文件时,在ZipFile对象未完成元数据写入的情况下就读取了BytesIO内容。Zip格式的核心结构(中央目录、结束标记等)是在ZipFile的上下文管理器退出(即with块结束)时才会写入文件对象的。你的代码将三个对象放在同一个with语句中并行处理,导致读取BytesIO时,ZipFile还没完成收尾操作,生成的文件只有纯文本内容,缺少Zip格式必需的元数据——这就是unzip无法识别,但zcat能读取文本内容的原因。
修复后的代码
将BytesIO与ZipFile的上下文管理器嵌套,确保ZipFile完成所有写入操作后再读取BytesIO内容:
import io import zipfile with io.BytesIO() as fo: with zipfile.ZipFile(fo, 'w') as zip: zip.writestr('file.txt', b'Lorem ipsum') # 此时ZipFile已关闭,中央目录等元数据已写入BytesIO fo.seek(0) with open('outfile.zip', 'wb') as outfile: outfile.write(fo.read())
若使用Python 3.10+,也可以用简化的嵌套上下文语法:
import io import zipfile with io.BytesIO() as fo, zipfile.ZipFile(fo, 'w') as zip: zip.writestr('file.txt', b'Lorem ipsum') # 上下文退出后,ZipFile已完成所有写入 with open('outfile.zip', 'wb') as outfile: fo.seek(0) outfile.write(fo.read())
验证结果
运行修复后的代码,生成的outfile.zip大小会与直接用文件创建的一致(125字节),unzip可正常解压:
$ python3 script_fixed.py $ ll outfile.zip -rw-rw-r-- 1 neurino neurino 125 mar 11 14:45 outfile.zip $ unzip outfile.zip Archive: outfile.zip extracting: file.txt
内容的提问来源于stack exchange,提问作者neurino
相关产品推荐
相关产品推荐

