如何使用Python下载文件?

时间:2010-12-09 21:26:48

标签: python linux command-line centos wget

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

我需要下载像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这样的进度条。

非常感谢!

4 个答案:

答案 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尺寸来找到符合您要求的”最佳位置“。