Как скачать файлы с помощью Python? - PullRequest
4 голосов
/ 10 декабря 2010

Привет всем.Я новичок в Python и использую Python 2.5 для CentOS.

Мне нужно загрузить файлы типа WGET do.

Я провел некоторый поиск, и есть некоторые решения, очевидныеЭто так:

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

Это отлично работает.Но я хочу знать, является ли mp3-файл ОЧЕНЬ большим, например, 1 ГБ, 2 ГБ или даже больше.Может ли этот фрагмент кода все еще работать?Существуют ли лучшие способы загрузки больших файлов в Python, возможно, с помощью индикатора выполнения, например WGET do.

Большое спасибо!

Ответы [ 4 ]

16 голосов
/ 10 декабря 2010

Есть более простой способ:

import urllib
urllib.urlretrieve("http://www.example.com/songs/mp3.mp3", "/home/download/mp3.mp3")
3 голосов
/ 10 декабря 2010

Для действительно больших файлов ваш код будет использовать много памяти, так как вы загружаете весь файл в память одновременно. Возможно, было бы лучше прочитать и записать данные кусками:

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 голосов
/ 10 декабря 2010

Почему бы просто не позвонить wget тогда?

import os
os.system ("wget http://www.example.com/songs/mp3.mp3")
1 голос
/ 10 декабря 2010

Ваш текущий код будет читать весь поток в память перед записью на диск.Так что в случаях, когда размер файла превышает доступную память, вы столкнетесь с проблемами.

, чтобы решить эту проблему, вы можете одновременно читать фрагменты и записывать их в файл.


(скопировано с Поток больших двоичных файлов с помощью 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, чтобы найти" подходящее место "для ваших требований."

...