gpt4 book ai didi

python - 如何上下文管理多个 zip 文件的 BytesIO?

转载 作者:太空宇宙 更新时间:2023-11-04 02:15:58 25 4
gpt4 key购买 nike

我正在尝试在创建多个 zip 文件时对 BytesIO 流使用上下文管理器。在写入第一个 zip 文件后,我无法找到“重置”BytesIO 对象的方法,因此我可以使用相同的 BytesIO 对象来创建下一个 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()

最佳答案

您可以重复使用相同的 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()

关于python - 如何上下文管理多个 zip 文件的 BytesIO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52658732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com