如何使用Python下载文件?

嗨,大家好。 我是Python新手,在CentOS上使用Python 2.5。

我需要像WGET那样下载文件。

我已经做了一些search,并有一些解决scheme,一个显而易见的方法是:

 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这样的进度条。

非常感谢!

有一个更简单的方法:

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

对于真正大的文件,你的代码会占用大量的内存,因为你一次把整个文件加载到内存中。 读取和写入数据块可能会更好:

 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) 

那么为什么不直接调用wget呢?

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

写入磁盘之前,您的当前代码会将整个流读入内存。 因此,对于文件大于可用内存的情况,您将遇到问题。

要解决这个问题,您可以一次读取块并将其写入文件。


(从流大二进制文件与urllib2复制到文件 )

 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) 

“用各种CHUNK尺寸进行实验,找到满足您要求的”最佳位置“。