ошибка пропуска в l oop - JSONDecodeError: Ожидаемое значение: строка 1, столбец 1 (символ 0) - PullRequest
0 голосов
/ 21 апреля 2020

Я выполняю все oop запросов API (30 запросов каждую минуту). Данные возвращаются в формате JSON, который я преобразую в базу данных pandas (я идентифицирую столбцы и объединяю их). Иногда я получаю сообщение об ошибке ниже на одном из моих запросов, которое (автоматически) останавливает выполнение скрипта.

Есть ли способ указать Python просто пропустить эту ошибку и продолжить l oop?

Я не возражаю против того, чтобы не получать и не обрабатывать данные из этого одного ошибочного запроса.

Если это не так просто, есть хотя бы способ получить звуковое уведомление (звуковой сигнал) чтобы я знал об этом и мог снова запустить скрипт вручную?

Traceback (most recent call last):
  File "Skript.py", line 19, in <module>
    dfraw = pd.concat([pd.DataFrame({k: v}) for k, v in dataAPI.json().items() if k in columns], axis=1)
  File "C:\Users\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\requests\models
.py", line 898, in json

  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.752.0_x64__qbz5n2kfra8p0\lib\json\__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.752.0_x64__qbz5n2kfra8p0\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.752.0_x64__qbz5n2kfra8p0\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Вот код:

import pandas as pd
from pathlib import Path
import time
import datetime
import requests

while True:
    start = time.process_time()
    starttime = time.time()
    list_of_underlyings = ['X','Y','Z',...]

    for i in list_of_underlyings:
        url = ("https:xyzxyz?symbol=" + i + "&resolution=1&count=50&format=json")
        dataAPI = requests.get(url)
        columns = {'c', 'h', 'l', 'o', 't' , 'v'}
        dfraw = pd.concat([pd.DataFrame({k: v}) for k, v in dataAPI.json().items() if k in columns], axis=1)
        df = dfraw.reindex(columns = ['o', 'h', 'l', 'c', 'v' , 't'])

    time.sleep(60.0 - ((time.time() - starttime) % 60.0))

1 Ответ

1 голос
/ 21 апреля 2020

вы хотите попробовать, кроме блока, который будет пробовать ваш код, и если он прервется, он продолжит следующую итерацию l oop

try:
    //your code
except:
    continue

В качестве альтернативы вы можете использовать pass вместо continue если вы хотите, чтобы он ничего не делал, вместо пропуска этой итерации.

РЕДАКТИРОВАТЬ: если вы пытаетесь выполнить списочное восприятие, блоки try / кроме невозможны, вам нужно будет делать обычные для l oop для добавления элементов

РЕДАКТИРОВАТЬ 2: учитывая код, вы поместите try, кроме блока, внутри циклов for

import pandas as pd
from pathlib import Path
import time
import datetime
import requests

while True:
    start = time.process_time()
    starttime = time.time()
    try:

        list_of_underlyings = ['X','Y','Z',...]

        for i in list_of_underlyings:
            url = ("https:xyzxyz?symbol=" + i + "&resolution=1&count=50&format=json")
            dataAPI = requests.get(url)
            columns = {'c', 'h', 'l', 'o', 't' , 'v'}
            dfraw = pd.concat([pd.DataFrame({k: v}) for k, v in dataAPI.json().items() if k in columns], axis=1)
            df = dfraw.reindex(columns = ['o', 'h', 'l', 'c', 'v' , 't'])
    except JSONDecodeError:
        continue
    finally:
        time.sleep(60.0 - ((time.time() - starttime) % 60.0))

Так что вы попробуете свой код, и если вы натолкнетесь на неправильно отформатированную вещь, она поймает ее, а затем, наконец, будет спать в течение заданного времени, независимо от того, какой блок вы блокируете go.

...