繁体   English   中英

Python:从二进制而不是文件名打开zip文件

[英]Python: Open zip file from binary instead of filename

有没有办法通过传入zip文件的文字字节来初始化ZipFile对象,而不是让它读取文件名? 我正在构建一个不需要触摸磁盘的宁静应用程序; 它只是打开文件,对它做一些工作,重新拉链并发送它。

在对其他答案的评论中,你说你想这样做:

打开二进制字符串,就像它是一个zip文件一样。 打开它,读/写其中的文件,然后关闭它

除了创建一个预先填充二进制字符串的StringIO.StringIO (或cStringIO.StringIOio.BytesIO )之外,您只需执行与其他答案相同的StringIO.StringIO ,并在最后提取字符串。 StringIO和朋友为他们的构造函数获取一个可选的初始字符串,并且在完成后有一个getvalue方法来提取字符串。 文档非常简单,值得一读。

所以,尽可能贴近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存档和磁盘上的情况也是如此。 您通常可以通过附加具有相同路径的新文件来覆盖存档中的文件,但这通常是个坏主意(特别是如果您要创建这些内容以通过互联网发送)。

因此,您可能想要做的与您想要修改文件时完全相同:创建一个单独的输出文件,从输入文件中复制您需要的东西,并在进行时编写新内容。 只是在这种情况下,输入和输出文件都是包装StringIO对象的ZipFile对象。

当然,请改为使用(c)StringIO: http ://docs.python.org/2/library/stringio.html此外,您应该使用BytesIO for Python 3.但它确实存在2.6和2.7。

以下是使用(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()

另见:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM