【问题标题】:Python: Open file in zip without temporarily extracting itPython:在 zip 中打开文件而不临时解压缩它
【发布时间】:2013-10-22 16:54:54
【问题描述】:

如何在不先解压缩的情况下打开 zip 存档中的文件?

我正在使用 pygame。为了节省磁盘空间,我将所有图像都压缩了。 是否可以直接从 zip 文件加载给定的图像? 例如: pygame.image.load('zipFile/img_01')

【问题讨论】:

  • 什么样的图片文件? GIF、JPEG 和 PNG 已被压缩。

标签: python zipfile


【解决方案1】:

理论上,是的,这只是插入东西的问题。Zipfile 可以为您在 zip 存档中的文件提供一个类似文件的对象,而 image.load 将接受一个类似文件的对象。所以这样的事情应该可以工作:

import zipfile
archive = zipfile.ZipFile('images.zip', 'r')
imgfile = archive.open('img_01.png')
try:
    image = pygame.image.load(imgfile, 'img_01.png')
finally:
    imgfile.close()

【讨论】:

    【解决方案2】:

    Vincent Povirk 的回答不会完全奏效;

    import zipfile
    archive = zipfile.ZipFile('images.zip', 'r')
    imgfile = archive.open('img_01.png')
    ...
    

    你必须改变它:

    import zipfile
    archive = zipfile.ZipFile('images.zip', 'r')
    imgdata = archive.read('img_01.png')
    ...
    

    有关详细信息,请阅读ZipFile 文档here

    【讨论】:

    • image = pygame.image.load(imgfile, 'img_01.png') TypeError: must be string without null bytes, not str
    • 请解释您的更改。 read 返回一个包含文件内容的字符串; open 返回一个类似文件的对象。 pygame 的文档说 image.load 需要一个文件名或类似文件的对象。
    • @Vincent Povirk:感谢您的评论。问题仍然是 image.load 确实接受类似文件的对象,但不接受 zip-file-object。你必须以某种方式适应它。我也不相信我的答案,它还不优雅......
    【解决方案3】:
    import io, pygame, zipfile
    archive = zipfile.ZipFile('images.zip', 'r')
    
    # read bytes from archive
    img_data = archive.read('img_01.png')
    
    # create a pygame-compatible file-like object from the bytes
    bytes_io = io.BytesIO(img_data)
    
    img = pygame.image.load(bytes_io)
    

    我刚刚试图自己解决这个问题,并认为这对将来遇到这个问题的任何人都有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-05
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多