перебирать ключи dict, переходить в новый dict, если ключей не существует, передавать ключ со значением None - PullRequest
0 голосов
/ 26 июня 2019

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

for k in required_fields:
if k in response_data.keys():
    print(k, response_data[k])
else:
    print(k, None)

Я новичок в программировании (пара недель), это мой первый проект.

Я собираю данные временных рядов с веб-сокета обмена ByBit, преобразовываю их из JSON в Dict и сохраняю в базу данных. Веб-сокет отправляет только обновленные данные, поэтому один или несколько преобразованных ключей Dict могут отсутствовать. Я не могу понять, как объяснить это, не бросая KeyError. Я пытался использовать .get (), но он поддерживает только один аргумент, и я не уверен, как использовать его в итерации для создания нового dict.

В конечном итоге я хотел бы зафиксировать желаемые значения ключей в postgres, передав значение в виде «None», если они отсутствуют, ИЛИ вообще не передавая их, и оставив столбец таблицы пустым. Я в своей неопытности, я не уверен, что предпочтительнее.

Это пример сообщения после того, как я перешел в Dict, может изменяться вложенный словарь «data». Например, если цена не меняется между сделками, цена не будет отображаться в сообщении.

response_dict = ({'success': 'True', 'topic': 'trade.EOSUSD', 'data': [{'timestamp': '2019-06-20T10:06:36.030Z', 'symbol': 'EOSUSD', 'side': 'Sell',
                                                                    'size': 757, 'price': 6.77, 'tick_direction': 'PlusTick', 'trade_id': '5658ec5f-90ce-4244-9192-3f29057e223a', 'cross_seq': 59462597}]})

РЕДАКТИРОВАТЬ: Для пояснения, это пример другого возможного сообщения из той же подписки, например, цена не изменилась, поэтому сервер не отправляет ключ цены, пара значений.

response_dict = ({'success': 'True', 'topic': 'trade.EOSUSD', 'data': [{'timestamp': '2019-06-20T10:06:36.030Z', 'symbol': 'EOSUSD', 'side': 'Sell',
                                                                    'size': 757, 'tick_direction': 'PlusTick', 'trade_id': '5658ec5f-90ce-4244-9192-3f29057e223a', 'cross_seq': 59462597}]})

Это функция, которую я использую для извлечения вложенного словаря 'data', обязательные поля - это ключи, которые я хотел бы зафиксировать в базе данных.

def response_process(response_input):
    if "topic" in response_input and "trade" in response_input["topic"]:
        response_data = response_input["data"][0]
        required_fields = ['timestamp', 'symbol',
                           'side', 'size', 'price', 'tick_direction']
        response_data_2 = {key: value for key, value in response_data.items(
        ) if key in required_fields}
        updated_timestamp = str(datetime.datetime.strptime(
            response_data_2['timestamp'], '%Y-%m-%dT%H:%M:%S.%f%z'))
        response_data_2['timestamp'] = updated_timestamp
        commit_postgres(response_data_2)

и вот как я передаю эти данные в PostGres

def commit_postgres(response_data_input):
    conn = psycopg2.connect(
        "dbname='postgres' user='postgres' password = 'postgres123' host='localhost' port= '5432'")
    cur = conn.cursor()
    cur.execute(
        "CREATE TABLE IF NOT EXISTS {symbol} (timestamp text, side text, size float, price float, tick_direction text)".format(**response_data_input))
    conn.commit()
    cur.execute("INSERT INTO {symbol}(timestamp, side, size, price, tick_direction) VALUES (%(timestamp)s, %(side)s, %(size)s, %(price)s, %(tick_direction)s)".format(
        **response_data_input), (response_data_input))
    conn.commit()

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Зацикливайте обязательные поля, а не ключи словаря в ответе.Затем используйте if/else при назначении значения в новом словаре.

response_data_2 = {key: (response_data[value] if key in response_data else None) for value in required_fields}
0 голосов
/ 26 июня 2019

Попробуйте dict.update:

>>> d = dict(a=23, b=42, c=None)                                                                                                                                                              
>>> d                                                                                                                                                                                         
{'a': 23, 'b': 42, 'c': None}                                                                                                                                                                 
>>> d.update({'a' : 'foobar'})                                                                                                                                                                
>>> d                                                                                                                                                                                         
{'a': 'foobar', 'b': 42, 'c': None}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...