在创建多个zip文件时,我试图对BytesIO流使用上下文管理器。写入第一个zip文件后,我找不到方法来“重置” BytesIO对象,因此我可以使用相同的BytesIO对象来创建下一个zip文件。在将第二个zip文件写入磁盘后,尝试打开第二个zip文件时,总是收到“无法打开文件...作为存档”错误。第一个zip文件打开就好了。我已经搜索,找不到解决方案。将模式从写入更改为追加也无济于事。我当然可以重新初始化为新的BytesIO对象,但这使上下文管理器失败。下面是我认为应该工作的代码。我正在Windows 10上使用Anaconda Python 3.6.6。
import io
import os
import zipfile
with io.BytesIO() as bytes_io:
with zipfile.ZipFile(bytes_io, mode='w') as zf:
filecount = 0
for item in os.scandir(r'C:\Users\stephen\Documents'):
if not item.is_dir():
zf.write(item.path, item.name)
filecount += 1
if filecount % 3 == 0:
with open(r'C:\Users\stephen\Documents\\' + str(filecount // 3) + '.zip', 'wb') as f:
f.write(bytes_io.getvalue())
bytes_io.seek(0)
bytes_io.truncate()
答案 0 :(得分:2)
您可以重用相同的BytesIO
对象,但是您应该为要创建的每个zip文件创建一个新的ZipFile
对象:
with io.BytesIO() as bytes_io:
filecount = 0
for item in os.scandir(r'C:\Users\stephen\Documents'):
if not item.is_dir():
with zipfile.ZipFile(bytes_io, mode='w') as zf:
zf.write(item.path, item.name)
filecount += 1
if filecount % 3 == 0:
with open(r'C:\Users\stephen\Documents\\' + str(filecount // 3) + '.zip', 'wb') as f:
f.write(bytes_io.getvalue())
bytes_io.seek(0)
bytes_io.truncate()