如果我在Python字符串中有zip文件内容,能否不写入文件解压?

18 投票
3 回答
13612 浏览
提问于 2025-04-15 13:47

我写了一些Python代码,用来从网上获取一个zip文件,并把它放进一个字符串里:

In [1]: zip_contents[0:5]
Out[1]: 'PK\x03\x04\x14'

我发现有一个叫zipfile的库,但我找不到一个可以直接接受一堆原始zip数据的函数。它似乎只想从文件里读取。

我真的需要把这个数据先放到一个临时文件里吗,还是说有其他办法可以解决这个问题?

3 个回答

0

这个问题已经有点时间了,自从被接受的答案以来,Python有了一些变化。

cStringIO这个库在Python 3.0之后改了名字(更多细节可以查看 这个链接)。

你可以试试下面的代码:

import io
import zipfile

fp = io.StringIO('PK\x03\x04\x14') # or io.BytesIO if you have a Bytes object
zfp = zipfile.ZipFile(fp, "r")
zfp.extractall("./extract_folder") # extract zip in a `extract_folder` folder
6

把你的字符串放在一个 cStringIO 对象里。这个东西看起来、使用起来和文件对象很像,但它其实是在内存里运行的。

33

zipfile.ZipFile 可以接受任何像文件一样的对象:

class zipfile.ZipFile(file, …)

打开一个 ZIP 文件,这里的 file 可以是一个 文件路径(字符串形式),也可以是一个 像文件的对象,或者是一个类似路径的对象。

所以你可以使用 BytesIO (3.x) 或者 StringIO (2.x)

# Modern Python 3.x
from io import BytesIO
import zipfile

fp = BytesIO(b'PK\x03\x04\x14')
zfp = zipfile.ZipFile(fp, "r")
# Legacy Python 2.x
try:
    from cStringIO import StringIO
except:
    from StringIO import StringIO
import zipfile

fp = StringIO('PK\x03\x04\x14')
zfp = zipfile.ZipFile(fp, "r")

撰写回答