2010-12-09 90 views
4

嗨,大家好。我是Python新手,在CentOS上使用Python 2.5。如何使用Python下載文件?

我需要下載像WGET這樣的文件。

我已經做了一些搜索,並有一些解決方案,一個顯而易見的方法是這樣的:

import urllib2 
mp3file = urllib2.urlopen("http://www.example.com/songs/mp3.mp3") 
output = open('test.mp3','wb') 
output.write(mp3file.read()) 
output.close() 

這工作得很好。但是我想知道,如果mp3文件非常大,比如1Gb,2Gb甚至更大。這段代碼片段仍然可以工作嗎?有更好的方法來下載Python中的大文件,也許有像WGET這樣的進度條。

非常感謝!

+0

我想你的問題是關於反覆讀,同時寫一大塊,而不是整個文件讀入內存在一次只給它的所有寫出來的之後的磁盤。 – chrisaycock 2010-12-09 21:31:10

+3

可能的重複[流大二進制文件與urllib2文件](http://stackoverflow.com/questions/1517616/stream-large-binary-files-with-urllib2-to-file) – katrielalex 2010-12-09 21:31:27

回答

15

有一個簡單的方法:

import urllib 
urllib.urlretrieve("http://www.example.com/songs/mp3.mp3", "/home/download/mp3.mp3") 
2

爲什麼不直接致電wget呢?

import os 
os.system ("wget http://www.example.com/songs/mp3.mp3") 
3

對於真正的大文件,由於您將整個文件一次加載到內存中,您的代碼會佔用大量內存。可能會更好地讀取和寫入數據塊:

from __future__ import with_statement 
import urllib2 
mp3file = urllib2.urlopen("http://www.example.com/songs/mp3.mp3") 
with open('test.mp3','wb') as output: 
    while True: 
     buf = mp3file.read(65536) 
     if not buf: 
      break 
     output.write(buf) 
1

您的當前代碼會在寫入磁盤之前將整個流讀入內存。因此,對於文件大於可用內存的情況,您將遇到問題。

要解決此問題,您可以一次讀取塊並將它們寫入文件。


(從Stream large binary files with urllib2 to file複製)

req = urllib2.urlopen(url) 
CHUNK = 16 * 1024 
with open(file, 'wb') as fp: 
    while True: 
    chunk = req.read(CHUNK) 
    if not chunk: break 
    fp.write(chunk) 

「試驗了一下各種塊大小,找到 」甜蜜點「 滿足您的要求。」