2009-01-28 77 views
1

我正在嘗試解壓縮發送給我的一些彩信。問題是,有時它有效,而其他的則不行。當它不起作用時,python zipfile模塊會抱怨並說這是一個不好的zip文件。但是使用unix unzip命令解壓縮zip文件。ZipFile抱怨,有沒有辦法使用zipfile模塊?

這是香港專業教育學院得到了

zippedfile = open('%stemp/tempfile.zip' % settings.MEDIA_ROOT, 'w+') 
zippedfile.write(string) 
z = zipfile.ZipFile(zippedfile) 

我使用「W +」,寫一個字符串到它,該字符串包含一個base64解碼的zip文件的字符串表示。

然後,我這樣做:

filelist = z.infolist() 
images = [] 

for f in filelist: 
    raw_mimetype = mimetypes.guess_type(f.filename)[0] 
    if raw_mimetype: 
     mimetype = raw_mimetype.split('/')[0] 
    else: 
     mimetype = 'unknown' 
    if mimetype == 'image': 
     images.append(f.filename) 

這樣,我已經得到了zip文件的所有圖像的列表。但這並不總是有效,因爲zipfile模塊抱怨一些文件。

有沒有辦法做到這一點,而無需使用壓縮文件模塊?

我能以某種方式使用UNIX命令解壓,而不是壓縮文件,然後以同樣的事情,以檢索所有從存檔的圖像?

回答

4

你應該寫壓縮數據到它時,很有可能以二進制方式打開,該文件。也就是說,您應該使用

zippedfile = open('%stemp/tempfile.zip' % settings.MEDIA_ROOT, 'wb+') 
+0

對不起,這沒有幫助,它仍然抱怨一個錯誤的zip文件。不要驚訝,因爲代碼有時會起作用。 – espenhogbakk 2009-01-28 17:51:28

0

您可能必須關閉並重新打開文件,或者可能在寫入文件後尋找文件的開始位置。

filename = '%stemp/tempfile.zip' % settings.MEDIA_ROOT 
zippedfile = open(filename , 'wb+') 
zippedfile.write(string) 
zippedfile.close() 
z = zipfile.ZipFile(filename,"r") 

你說的字符串是base64解碼,但你沒有顯示任何代碼解碼它 - 你確定它還沒有編碼?

data = string.decode('base64') 
+0

對不起,這沒有幫助,我實際上得到一個錯誤,我無法執行一個關閉的文件上的I/O操作,當我嘗試。 – espenhogbakk 2009-01-28 17:52:07