Python : 일시적으로 추출하지 않고 zip으로 파일 열기


82

압축을 풀지 않고 zip 아카이브의 파일을 열려면 어떻게해야합니까?

파이 게임을 사용하고 있습니다. 디스크 공간을 절약하기 위해 모든 이미지를 압축했습니다. zip 파일에서 직접 주어진 이미지를로드 할 수 있습니까? 예를 들면 : pygame.image.load('zipFile/img_01')


2
어떤 종류의 이미지 파일입니까? GIF, JPEG 및 PNG는 이미 압축되어 있습니다.
hughdbrown

답변:


109

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문서를 읽으 십시오 .


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 파일 객체는 받아들이지 않는다는 점입니다. 어떻게 든 그것에 적응해야합니다. 나는 하나 내 대답을 확신 아니에요 그것은 ...하면서도 우아한 아니다
Jellema

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.