Загрузка большого количества файлов с помощью python

Есть ли хороший способ загрузки большого количества файлов с помощью python? Этот код достаточно быстр, чтобы загрузить около 100 или около того файлов. Но мне нужно загрузить 300 000 файлов. Очевидно, что все они очень маленькие файлы (или я бы не загружал 300 000 из них :)), поэтому реальным узким местом, похоже, является этот цикл. У кого-нибудь есть мысли? Может быть, использовать MPI или потоки?

Мне просто нужно жить с бутылочной шее? Или существует более быстрый способ, возможно, даже не использование python?

(Я включил полное начало кода только ради полноты)

from __future__ import division import pandas as pd import numpy as np import urllib2 import os import linecache #we start with a huge file of urls data= pd.read_csv("edgar.csv") datatemp2=data[data['form'].str.contains("14A")] datatemp3=data[data['form'].str.contains("14C")] #data2 is the cut-down file data2=datatemp2.append(datatemp3) flist=np.array(data2['filename']) print len(flist) print flist ###below we have a script to download all of the files in the data2 database ###here you will need to create a new directory named edgar14A14C in your CWD original=os.getcwd().copy() os.chdir(str(os.getcwd())+str('/edgar14A14C')) for i in xrange(len(flist)): url = "ftp://ftp.sec.gov/"+str(flist[i]) file_name = str(url.split('/')[-1]) u = urllib2.urlopen(url) f = open(file_name, 'wb') f.write(u.read()) f.close() print i 

  • Как открыть изображение из Интернета в PIL?
  • Python: URLError: <ошибка urlopen
  • Как отладить запрос urllib2, который использует базовый обработчик проверки подлинности
  • Многопроцессорность бесполезна с urllib2?
  • Изменение пользовательского агента на urllib2.urlopen
  • Использование urllib2 с прокси SOCKS
  • Как ускорить работу urllib2 на Python при выполнении нескольких запросов
  • Как я могу выделить конкретные данные из открытого URL-адреса в Python с помощью urllib2?
  • One Solution collect form web for “Загрузка большого количества файлов с помощью python”

    Обычный шаблон с многопроцессорностью – это создание функции job() которая принимает аргументы и выполняет некоторую потенциально связанную с ЦП работу.

    Пример: ( на основе вашего кода )

     from multiprocessing import Pool def job(url): file_name = str(url.split('/')[-1]) u = urllib2.urlopen(url) f = open(file_name, 'wb') f.write(u.read()) f.close() pool = Pool() urls = ["ftp://ftp.sec.gov/{0:s}".format(f) for f in flist] pool.map(job, urls) 

    Это будет делать несколько вещей:

    • Создайте многопроцессорный пул и набор рабочих, так как у вас есть CPU (CPU) или CPU Core (s)
    • Создайте список входов функции job() .
    • Сопоставьте список входов urls для job() и дождитесь завершения всех заданий.

    multiprocessing.Pool.map процесс multiprocessing.Pool.map позаботится о том, чтобы разделить ваш вход через no. работников в бассейне.

    Еще одна полезная аккуратная вещь, которую я сделал для такого рода работ, – это использовать такой прогресс :

     from multiprocessing import Pool from progress.bar import Bar def job(input): # do some work pool = Pool() inputs = range(100) bar = Bar('Processing', max=len(inputs)) for i in pool.imap(job, inputs): bar.next() bar.finish() 

    Это дает вам хороший индикатор выполнения на консоли, так как ваши рабочие места развиваются, поэтому у вас есть представление о прогрессе и eta и т. Д.

    Я также нашел здесь очень полезную библиотеку запросов и гораздо более удобный набор API для работы с веб-ресурсами и загрузкой контента.

    Python - лучший язык программирования в мире.