Как сохранить каждый цикл в новый файл с помощью Python - PullRequest
0 голосов
/ 03 января 2019

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

Мне удалось вытащить запрос через цикл, но я не знаю, как сохранитьэто каждый вывод в новый файл.

import requests
import json

for i in range(1, 5):
    vino = requests.get('https://www.vivino.com/api/explore/explore?country_code=dk&currency_code=DKK&grape_filter=varietal&merchant_id=&min_rating=1&order_by=&order=desc&page='+str(i)+'&price_range_max=2500&price_range_min=0&wine_type_ids[]=1&wine_type_ids[]=2')
    data = vino.json()
    with open('data' + str(i) + '.json', 'w') as outfile:
    json.dump(data, outfile)

Ответы [ 4 ]

0 голосов
/ 03 января 2019

Попробуйте это

import requests
import json

for i in range(1, 5):
    vino = requests.get('https://www.vivino.com/api/explore/explore?country_code=dk&currency_code=DKK&grape_filter=varietal&merchant_id=&min_rating=1&order_by=&order=desc&page='+str(i)+'&price_range_max=2500&price_range_min=0&wine_type_ids[]=1&wine_type_ids[]=2')
    data = vino.json()
    with open('data' + str(i) + '.json', 'w') as outfile:
        json.dump(data, outfile)
0 голосов
/ 03 января 2019

не уверен, почему Милад предложил использовать write() - ваш код в основном в порядке, просто нужно сделать отступ правильно. Вы можете сделать:

import requests
import json

for i in range(1, 5):
    vino = requests.get('https://www.vivino.com/api/explore/explore?country_code=dk&currency_code=DKK&grape_filter=varietal&merchant_id=&min_rating=1&order_by=&order=desc&page='+str(i)+'&price_range_max=2500&price_range_min=0&wine_type_ids[]=1&wine_type_ids[]=2')
    data = vino.json()
    with open('data' + str(i) + '.json', 'w') as outfile:
       json.dump(data, outfile)

обратите внимание на лишние пробелы в начале последней строки, они важны и это то, на что люди ссылаются с отступом. чтение некоторых руководств по Python может помочь

сделав этот код немного приятнее, вы можете использовать больше интерфейса requests, выполнив:

import requests
import json

for page in range(1, 5):
    vino = requests.get('https://www.vivino.com/api/explore/explore', params={
        'country_code': 'dk',
        'currency_code': 'DKK',
        'grape_filter': 'varietal',
        'min_rating': 1,
        'page': page,
        'wine_type_ids[]': [1, 2],
    })

    # raise an exception if this request wasn't successful
    vino.raise_for_status()

    data = vino.json()
    with open('data' + str(page) + '.json', 'w') as outfile:
       json.dump(data, outfile)

если вы собираетесь читать вывод самостоятельно, я бы "распечатал" вывод примерно так:

    with open('data' + str(page) + '.json', 'w') as outfile:
       json.dump(data, outfile, sort_keys=True,
                 indent=4, separators=(',', ': '))

наконец, если вы используете последнюю версию Python3, я бы также использовал новые «строки формата»:

    with open(f'data{page}.json', 'w') as outfile:
       json.dump(data, outfile, sort_keys=True,
                 indent=4, separators=(',', ': '))

, поскольку это приводит к тому, что код становится проще для чтения ...

0 голосов
/ 03 января 2019

Ответ с сайта уже содержит данные json, но в виде строки. Если вы хотите сохранить его в файл, вы можете просто сохранить эту строку, не нужно вызывать функцию json() для объекта ответа. json() метод будет анализировать эти данные для объектов Python (dict и списки). Вы можете использовать это после, чтобы возиться с данными. Если вы просто хотите сохранить его, это не нужно.

Это будет работать:

import requests

for i in range(1, 5):
    resp = requests.get('https://www.vivino.com/api/explore/explore?country_code=dk&currency_code=DKK&grape_filter=varietal&merchant_id=&min_rating=1&order_by=&order=desc&page='+str(i)+'&price_range_max=2500&price_range_min=0&wine_type_ids[]=1&wine_type_ids[]=2')
    data = resp.text

    with open("data-{}.json".format(i), 'w') as outfile:
        outfile.write(data)
0 голосов
/ 03 января 2019

сделать это так:

import requests
import json

for i in range(1, 5):
    vino = requests.get('https://www.vivino.com/api/explore/explore?country_code=dk&currency_code=DKK&grape_filter=varietal&merchant_id=&min_rating=1&order_by=&order=desc&page='+str(i)+'&price_range_max=2500&price_range_min=0&wine_type_ids[]=1&wine_type_ids[]=2')
    data = vino.json()
    with open('data' + str(i) + '.json', 'w') as outfile:
        outfile.write(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...