1

zip 形式で送信された MMS メッセージを解凍しようとしています。問題は、機能する場合と機能しない場合があることです。そして、それが機能しない場合、python zipfile モジュールは不平を言い、それが悪い zip ファイルであると言います。ただし、zipfile は unix unzip コマンドを使用して正常に解凍されます。

これは私が得たものです

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

「w+」を使用して文字列を書き込んでいます。文字列には、zip ファイルの base64 でデコードされた文字列表現が含まれています。

それから私はこれが好きです:

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 モジュールが一部のファイルについて不平を言うため、これは常に機能するとは限りません。

zipfile モジュールを使用せずにこれを行う方法はありますか?

どういうわけか、zipfile の代わりに unzip コマンドを使用して、アーカイブからすべての画像を取得するために同じことを行うことはできますか?

4

2 に答える 2

5

圧縮されたデータをファイルに書き込むときは、ファイルをバイナリ モードで開く必要があります。つまり、使用する必要があります

zippedfile = open('%stemp/tempfile.zip' % settings.MEDIA_ROOT, 'wb+')
于 2009-01-28T15:37:03.240 に答える
1

ファイルを閉じて再度開くか、書き込み後にファイルの先頭をシークする必要がある場合があります。

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')
于 2009-01-28T16:21:03.977 に答える