Python: Mở tệp ở dạng zip mà không cần giải nén tạm thời


82

Làm cách nào để mở tệp trong kho lưu trữ zip mà không cần giải nén chúng trước?

Tôi đang sử dụng pygame. Để tiết kiệm dung lượng đĩa, tôi đã nén tất cả các hình ảnh. Có thể tải một hình ảnh nhất định trực tiếp từ tệp zip không? Ví dụ: pygame.image.load('zipFile/img_01')


2
Những loại tệp hình ảnh? GIF, JPEG và PNG đã được nén.
hughdbrown

Câu trả lời:


109

Câu trả lời của Vincent Povirk sẽ không hoạt động hoàn toàn;

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

Bạn phải thay đổi nó trong:

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

Để biết chi tiết, hãy đọc ZipFiletài liệu tại đây .


image = pygame.image.load (imgfile, 'img_01.png') Lỗi Loại: phải chuỗi không rỗng byte, không str
user2880847

Vui lòng giải thích sự thay đổi của bạn. read trả về một chuỗi có nội dung của tệp; open trả về một đối tượng giống tệp. Tài liệu của pygame cho biết image.load muốn có tên tệp hoặc đối tượng giống tệp.
Esme Povirk

@Vincent Povirk: Cảm ơn bạn đã bình luận. Vấn đề vẫn là image.load không chấp nhận một đối tượng giống tệp, nhưng không chấp nhận đối tượng zip-tệp. Bạn phải thích nghi với điều đó bằng cách nào đó. Tôi không bị thuyết phục bởi câu trả lời của tôi, hoặc, nó không phải là thanh lịch nhưng ...
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)

Tôi đã cố gắng tìm ra điều này cho bản thân mình ngay bây giờ và nghĩ rằng điều này có thể hữu ích cho bất kỳ ai gặp câu hỏi này trong tương lai.


8

Về lý thuyết, có, đó chỉ là vấn đề cắm mọi thứ vào. Zipfile có thể cung cấp cho bạn một đối tượng giống tệp cho tệp trong kho lưu trữ zip và image.load sẽ chấp nhận một đối tượng giống tệp. Vì vậy, một cái gì đó như thế này sẽ hoạt động:

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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.