Как загружать файлы с помощью Python?

Всем привет. Я новичок в 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-файл ОЧЕНЬ большой, например, 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, чтобы найти« сладкое пятно »для ваших требований».