Кэширование результатов из веб-API с использованием open - PullRequest
0 голосов
/ 22 ноября 2018

Я использую много данных, возвращаемых из WEB-API. Функция ниже вызывает API 22 раза, декодирует и загружает JSON в формат Python.Затем я сохраняю результаты в большом списке из 22 страниц с каждыми 100 объектами искусства в качестве данных.

fourteen_list = return_14th_century_works_list() 

Чтобы ограничить необходимые вызовы API, я хочу создать функцию, которая хранит этот список в виде файла.если его нет, и когда он присутствует, я хочу загрузить файл с моего компьютера.Я придумал следующее:

with open('fourteenth_century_list.txt', 'w') as fourteenth_century_file:
    print(fourteen_list, file=fourteenth_century_file)

try:
    with open('fourteenth_century_list.txt', 'r') as fourteenth_century_file:
        fourteenth_list_cache = fourteenth_century_file.read()  
        count_objects(fourteenth_list_cache) 
except FileNotFoundError:
    fourteenth_list = return_14th_century_works_list() Calls API again
    count_objects(fourteen_list)

Я использую функцию count_objects, чтобы проверить, все ли еще работает, но файл, который открывается в блоке try, похоже, не возвращается так же, как я сохранилЭто;Когда я запускаю этот код, вызов функции в блоке try возвращает ошибку типа.Для меня это признак того, что файл, открытый с диска, имеет несколько иной формат, чем если бы я загружал его непосредственно из API.

Когда я вызываю функцию count_objects () с не кэшированной версией моегосписок, так что четырнадцать_листов в этом случае работает нормально.

Изменяет ли with_open (имя файла, 'w'), а затем with_open (имя файла, 'r') ваши данные, и если нет, то что я здесь не так делаю?

1 Ответ

0 голосов
/ 23 ноября 2018

Проблема здесь в том, что когда вы print получаете список словарей для файла, вы создаете строковое представление списка.Затем вы читаете эту строку обратно и передаете ее в count_objects(), но она падает, потому что она ожидает список словарей, а не большую строку.

Вместо печати, лучшим подходом будет сериализация спискаподдержать JSON - что бы сохранить его структуру.Вы также хотите записать список в кэш в блоке except после того, как вы получили данные из API.

import json

try:
    with open('fourteenth_century_list.json', 'r') as fourteenth_century_file:
        fourteenth_list_cache = json.load(fourteenth_century_file)
        count_objects(fourteenth_list_cache) 
except FileNotFoundError:
    # Calls API again
    fourteenth_list = return_14th_century_works_list() 
    count_objects(fourteen_list)

    # Cache the API data
    with open('fourteenth_century_list.json', 'w') as fourteenth_century_file:
        json.dump(fourteen_list, fourteenth_century_file)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...