2012-04-24 19 views
2

私はzipファイルを返す複数のURLを持っています。ファイルのほとんどは、私は次のようにurllib2のライブラリを使用してダウンロードすることができるよ:Pythonで大きなzipファイルをダウンロード

request = urllib2.urlopen(url) 
zip_file = request.read() 

私がいる問題が、ファイルの1つは、(zip形式)サイズは35MBであることであり、私のことができるんですよんこのライブラリを使用してダウンロードを完了します。私はそれをwgetとブラウザを使って普通にダウンロードすることができます。私はこのようなchuncksでファイルをダウンロードして試してみました

request = urllib2.urlopen(url) 
buffers = [] 
while True: 
    buffer = request.read(8192) 
    if buffer: 
     buffers.append(buffer) 
    else: 
     break 
final_file = ''.join(buffers) 

しかし、これはまた、ダウンロードが完了していません。エラーは発生しないので、何が起こっているのかをデバッグするのは難しいです。残念ながら、URL /ファイルの例はここに掲載できません。

提案/アドバイスはありますか?

+0

詳細情報やそれを再現するURLがなければ、デバッグするのはかなり難しいです。しかし、 'final_file = request.read()'だけを使用するのはなぜですか?上記のコードでは、すべてのデータをメモリに格納する文字列を作成していますので、一度にコードを読み取るコードが複雑になる理由はありません。 –

+0

の可能な複製[どのように私はpythonでurllib2を使用してzipファイルをダウンロードしますか?](http://stackoverflow.com/questions/4028697/how-do-i-download-a-zip-file-in-python-using -urllib2) –

+0

@benhoytこれは私の最初の試みでしたが、うまくいかなかったのです。だから私はchuncksでファイルを分割しようとしたのです – duduklein

答えて

2

これは私のアプリケーションからコピー&ペーストして、独自のアップデートインストーラをダウンロードします。ブロック単位でファイルを読み取り、すぐにブロックをディスク上の出力ファイルに保存します。私は必要に応じて、GUIのボタンからダウンロードをキャンセルするGUIスレッドとself.terminateでダウンロードの進行状況を表示するためにself.sizeself.actualSizeを使用

def DownloadThreadFunc(self): 
    try: 
     url = self.lines[1] 
     data = None 
     req = urllib2.Request(url, data, {}) 
     handle = urllib2.urlopen(req) 

     self.size = int(handle.info()["Content-Length"]) 
     self.actualSize = 0 
     name = path.join(DIR_UPDATES, url.split("/")[-1]) 
     blocksize = 64*1024 

     fo = open(name, "wb") 
     while not self.terminate: 
      block = handle.read(blocksize) 
      self.actualSize += len(block) 
      if len(block) == 0: 
       break 
      fo.write(block) 
     fo.close() 
    except (urllib2.URLError, socket.timeout), e: 
     try: 
      fo.close() 
     except: 
      pass 
     error("Download failed.", unicode(e)) 

+0

これは完全に機能しました!どうもありがとう。しかし、私の単純化されたバージョンがなぜ機能しなかったのか教えていただけますか? – duduklein

+0

いいえ。しかし、私はこの種の建設を疑うことがあります。ブロックをディスクに直接格納して、出力ファイルに進捗状況が表示されるようにします。 – Fenikso

+0

私はあなたの意見を見ます。私はあなたのバージョンのコードをメモリ内にだけ保存してみましたが、それもうまくいきました。それは私の初期バッファサイズ(小さすぎる)ですか? – duduklein

関連する問題