Python:一時的に解凍せずにzipでファイルを開く


84

最初にファイルを抽出せずにzipアーカイブ内のファイルを開くにはどうすればよいですか?

私はpygameを使用しています。ディスク容量を節約するために、すべての画像を圧縮しました。特定の画像をzipファイルから直接ロードすることは可能ですか?例えば: pygame.image.load('zipFile/img_01')


2
どんな画像ファイル?GIF、JPEG、およびPNGはすでに圧縮されています。
hughdbrown 2013年

回答:


114

VincentPovirkの答えは完全には機能しません。

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ドキュメントをお読みください


image = pygame.image.load(imgfile、 'img_01.png')TypeError:strではなくnullバイトのない文字列である必要があります
user2880847 2013年

変更点を説明してください。readは、ファイルの内容を含む文字列を返します。openは、ファイルのようなオブジェクトを返します。pygameのドキュメントには、image.loadがファイル名またはファイルのようなオブジェクトを必要としていると書かれています。
Esme Povirk 2013年

@Vincent Povirk:コメントありがとうございます。image.loadはファイルのようなオブジェクトを受け入れますが、zip-file-objectを受け入れないという問題が残ります。どういうわけかそれに適応する必要があります。私も自分の答えに確信が
持て

21
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)

私はちょうど今これを自分で理解しようとしていて、これは将来この質問に出くわす人にとって役立つかもしれないと思いました。


8

理論的には、はい、プラグインするだけです。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()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.