Как можно ускорить процесс записи csv в json?

import requests
import csv
import urllib.request
import json

link = 'https://dsa.court.gov.ua/open_data_json.php?json=532'

response = requests.get(link).json()
urls = []
for item in response['Файли']:
    urls.append(list(item.values())[0])
    for url in urls:
        url = url
        response = urllib.request.urlopen(url)
        lines = [l.decode('utf-8') for l in response.readlines()]
        cr = csv.reader(lines, delimiter='\t')
        data = []
        for row in cr:
            if 'Херсонський міський суд Херсонської області' in row[0]:
                data.append({'court_name':row[0], 'case_number':row[1], 'case_proc':row[2], 'registration_date':row[3],
                     'judge':row[4], 'judges':row[5], 'participants':row[6], 'stage_date':row[7], 'stage_name':row[8],
                             'cause_result':row[9], 'cause_dep':row[10], 'type':row[11], 'description':row[12]})

        with open('12.json', 'a', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=13)


Все работает как нужно но сам процесс вывода и записи занимает много времени, можно ли это ускорить?
Наперет Спасибо!
  • Вопрос задан
  • 87 просмотров
Решения вопроса 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Самое очевидное - не открывать файл на каждой итерации двух вложенных циклов.
Ответ написан
@rPman
Ты запрашиваешь список ссылок на csv файлоы веб запросом, затем загружаешь по одной ссылке с сайта (самое долгое имхо) и для каждого формируешь массив (всего лишь двухмерный, т.е. твой json плоский), фильтруя записи по одному полю, плюс декодируя данные из utf-8 во внутреннее представление python (unicode) и обратно при сохранении, что медленнее чем работать с байтами.

Т.е. что я бы сделал - либо используя асинхронщину либо (так просто проще закодить) двумя независимыми потоками или процессами, первый загружал бы данные (возможно сразу несколькими запросами, но если там один физический сайт-источник то это может не ускорить загрузку) и складывал бы их в файлы, а второй ждал бы не обработанные файлы (пока файл загружается и сохраняется на диск, его имя должно быть с пометкой о том что файл не готов, а по окончанию переименовывается), и обрабатывал бы их как поток байт (единственное место где нужно декодирование - это поиск подстроки-фильтре но помятуя про utf-8 в данном конкретном случае можно обойтись простым побайтовым поиском). Мало того, даже не надо заниматься кодированием json, просто выводи его print-ом, подставляя где надо имена полей и ковычки, нет нужды промежуточно сохранять это в массиве - прочитал csv строку и тут же ее сохранил в json, если принимающий понимает utf-8 (а сейчас все они понимают), т.е. нет нужды подменять символы на длиннющую конструкцию \uXXXX, максимум экранирование ковычек " и \ (то же самое с чтением csv),.. но прежде чем переписывать эту часть кода, достаточно хотя бы просто оптимизировать загрузку файлов, вполне возможно что 99% тормозов там
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы