嗨,大家好。 我是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尺寸进行实验,找到满足您要求的”最佳位置“。