पायथन: अस्थायी रूप से निकाले बिना ज़िप में फ़ाइल खोलें


84

मैं उन्हें पहले निकाले बिना ज़िप संग्रह में फाइलें कैसे खोल सकता हूं?

मैं pygame का उपयोग कर रहा हूँ। डिस्क स्थान को बचाने के लिए, मेरे पास सभी चित्र हैं। क्या ज़िप फ़ाइल से सीधे किसी दिए गए चित्र को लोड करना संभव है? उदाहरण के लिए: pygame.image.load('zipFile/img_01')


2
किस प्रकार की छवि फ़ाइलें? जीआईएफ, जेपीईजी, और पीएनजी पहले से ही संपीड़ित हैं।
हुग्डब्रोर्न

जवाबों:


114

विन्सेन्ट पोविर्क का जवाब पूरी तरह से काम नहीं करेगा;

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: null बाइट्स के बिना स्ट्रिंग होना चाहिए, str नहीं
user2880847

कृपया अपने परिवर्तन की व्याख्या करें। फ़ाइल की सामग्री के साथ एक स्ट्रिंग लौटाता है; फ़ाइल जैसी वस्तु लौटाता है। pygame के प्रलेखन का कहना है कि image.load एक फ़ाइल नाम या फ़ाइल जैसी वस्तु चाहता है।
एस्मे पोविर्क

@Vincent Povirk: टिप्पणी करने के लिए धन्यवाद। यह समस्या बनी हुई है कि image.load फ़ाइल जैसी ऑब्जेक्ट को स्वीकार करता है, लेकिन ज़िप-फ़ाइल-ऑब्जेक्ट को स्वीकार नहीं करता है। आपको किसी तरह उस के अनुकूल होना होगा। मैं अपने जवाब के प्रति आश्वस्त नहीं हूँ, यह अभी तक सुरुचिपूर्ण नहीं है ...
जेलीमा

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

सिद्धांत रूप में, हाँ, यह केवल चीजों को प्लग करने की बात है। ज़िपफ़ाइल आपको ज़िप आर्काइव में फ़ाइल के लिए फ़ाइल जैसी वस्तु दे सकता है, और 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()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.