我需要下载像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 :(得分:16)
有一种更简单的方法:
import urllib
urllib.urlretrieve("http://www.example.com/songs/mp3.mp3", "/home/download/mp3.mp3")
答案 1 :(得分: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)
答案 2 :(得分:2)
为什么不拨打wget
呢?
import os
os.system ("wget http://www.example.com/songs/mp3.mp3")
答案 3 :(得分: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)
“尝试使用各种CHUNK尺寸来找到符合您要求的”最佳位置“。