有没有办法通过传入zip文件的字面字节来初始化ZipFile
对象,而不是让它读取文件名?我正在构建一个不需要触摸磁盘的宁静应用程序;它只是打开文件,对它做一些工作,重新拉链并发送它。
答案 0 :(得分:4)
在对其他答案的评论中,你说你想这样做:
打开二进制字符串,就像它是一个zip文件一样。打开它,读/写其中的文件,然后关闭它
除了创建预填充二进制字符串的StringIO.StringIO
(或cStringIO.StringIO
或io.BytesIO
)之外,您只需执行与其他答案相同的操作,并提取字符串到底。 StringIO
和朋友为他们的构造函数获取一个可选的初始字符串,并且在完成后使用getvalue
方法提取字符串。 The documentation非常简单,值得一读。
所以,尽可能贴近alecxe的答案:
from zipfile import ZipFile
try:
import cStringIO as StringIO
except ImportError:
import StringIO
in_memory = StringIO.StringIO(original_zip_data)
zf = ZipFile(in_memory, "a")
zf.writestr("file.txt", "some text contents")
zf.close()
new_zip_data = in_memory.getvalue()
但是,请注意ZipFile
无法真正写入zip存档,除了向其添加新文件的特殊情况。对于内存中的zip存档和磁盘上的情况也是如此。您通常可以通过附加具有相同路径的新文件来覆盖存档中的文件,但这通常是一个坏主意(特别是如果您要创建要通过互联网发送的这些内容)。
因此,您可能想要做的与您想要修改文件时完全相同:创建一个单独的输出文件,从输入文件中复制您需要的东西,并在进行时编写新内容。只是在这种情况下,输入和输出文件都是包裹ZipFile
个对象的StringIO
个对象。
答案 1 :(得分:2)
当然,请改用(c)StringIO:http://docs.python.org/2/library/stringio.html 此外,您应该使用BytesIO for Python 3.它确实存在2.6和2.7。
答案 2 :(得分:2)
以下是使用(c)StringIO
的示例:
from zipfile import ZipFile
try:
import cStringIO as StringIO
except ImportError:
import StringIO
in_memory = StringIO.StringIO()
zf = ZipFile(in_memory, "a")
zf.writestr("file.txt", "some text contents")
zf.close()
另见: