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

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

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

  • Как загрузить python из командной строки?
  • Flask / Werkzeug как подключить заголовок длины HTTP-содержимого к файлу
  • Google App Engine (Python) - загрузка файла (изображения)
  • Python: Загрузить возвращенный Zip-файл из URL-адреса
  • Загрузка файла admin в Django с идентификатором текущей модели
  • Django Служит для загрузки файла
  • (Я включил полное начало кода только ради полноты)

    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 

  • Потоки в Gtk python
  • Python: вывести команду Ctrl-C. Подсказка «действительно хочу выйти (y / n)», возобновить выполнение, если нет
  • Коды выхода в Python
  • Чтение файла без символов новой строки
  • Matplotlib: ширина линии добавляется к длине строки
  • os.path.getsize Возвращает неверное значение?
  • 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 - лучший язык программирования в мире.