2016-12-05 8 views
1

私はウェブサイトからファイルをダウンロードして解凍する必要があります。ここに私が使用しているコードはあります:Python:有効な.zipファイルをダウンロードするクロスプラットフォームコード

#!/usr/bin/python 

    #geoipFolder = r'/my/folder/path/ '  #Mac/Linux folder path 
    geoipFolder = r'D:\my\folder\path\ ' #Windows folder path 
    geoipFolder = geoipFolder[:-1]   #workaround for Windows escaping trailing quote 
    geoipName = 'GeoIPCountryWhois' 
    geoipURL = 'http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip' 

    import urllib2 
    response = urllib2.urlopen(geoipURL) 

    f = open('%s.zip' % (geoipFolder+geoipName),"w") 
    f.write(repr(response.read())) 
    f.close() 

    import zipfile 
    zip = zipfile.ZipFile(r'%s.zip' % (geoipFolder+geoipName)) 
    zip.extractall(r'%s' % geoipFolder) 

このコードはMacとLinuxのボックスでは動作しますが、Windowsでは動作しません。そこに.zipファイルが書き込まれますが、スクリプトはこのエラーをスローします。

zipfile.BadZipfile: File is not a zip file 

Windowsエクスプローラを使用してファイルを解凍することはできません。それはそう言います:

The compressed (zipped) folder is empty. 

しかし、ディスク上のファイルは6MBです。

私はWindowsで間違っていると思っていますか?

おかげ

+0

「urlopen」を混乱させる必要はないでしょう。あなたは単に 'urlretrieve(URL、path_to_file)'を使うことができます。 – ForceBru

答えて

3

あなたが書き込み/テキストモードでファイルを開いているので、あなたのZIPファイルは、(ラインターミネータの変換はバイナリデータをゴミ)の窓に破損している:

f = open('%s.zip' % (geoipFolder+geoipName),"w") 

あなたが書き込みで開く必要がありますこのような/バイナリモード:

f = open('%s.zip' % (geoipFolder+geoipName),"wb") 

(まだ当然のLinux上で動作します)

withブロックを使用して、それをやってより多くの神託の方法でそれをまとめる(およびreprを削除)するには、次の

with open('{}{}.zip'.format(geoipFolder,geoipName),"wb") as f: 
    f.write(response.read()) 

EDIT:ファイルをディスクに書き込みする必要はありません、あなたはio.BytesIOを使用することができますが、ZipFileので、オブジェクトはファイルハンドルを最初のパラメータとして受け取ります。

import io 
import zipfile 

with open('{}{}.zip'.format(geoipFolder,geoipName),"wb") as f: 
    outbuf = io.BytesIO(f.read()) 

zip = zipfile.ZipFile(outbuf) # pass the fake-file handle: no disk write, no temp file 
zip.extractall(r'%s' % geoipFolder) 
+0

あなたはJean-Françoisの2倍の権利を持っています!私はWindows上で有効な.zipファイルを取得するために "wb"とrepr()を削除する必要がありました。 Merci beaucoup !! – idb

+0

私の編集をチェックすると、一時的な.zipファイルを避けることができます。あなたの問題を解決すると感じる答えを受け入れてください。 –

関連する問題