@ID6
Держитесь подальше от негативных людей

Как превратить str в словарь (2 часть)?

Я учтел ваши исправления с прошлого вопроса. Первое что я сделал сменил одинарные кавычки на двойные, далее пробовал через evel, ast_eval letteral_eval, но успеха ноль
Также еще убрал квадратные скобки а то мало-ли

Для тех кто задаётся вопросом "что нафиг здесь происходит?"

import ast, json
a = "{'content_type': 'text', 'id': 6450, 'message_id': 6450, 'from_user': {'id': 1004756967, 'is_bot': False, 'first_name': 'В отпуске', 'username': 'ocobash', 'last_name': None, 'language_code': 'ru', 'can_join_groups': None, 'can_read_all_group_messages': None, 'supports_inline_queries': None, 'is_premium': None, 'added_to_attachment_menu': None}, 'date': 1693667379, 'chat': {'id': 1004756967, 'type': 'private', 'title': None, 'username': 'ocobash', 'first_name': 'В отпуске', 'last_name': None, 'is_forum': None, 'photo': None, 'bio': None, 'join_to_send_messages': None, 'join_by_request': None, 'has_private_forwards': None, 'has_restricted_voice_and_video_messages': None, 'description': None, 'invite_link': None, 'pinned_message': None, 'permissions': None, 'slow_mode_delay': None, 'message_auto_delete_time': None, 'has_protected_content': None, 'sticker_set_name': None, 'can_set_sticker_set': None, 'linked_chat_id': None, 'location': None, 'active_usernames': None, 'emoji_status_custom_emoji_id': None, 'has_hidden_members': None, 'has_aggressive_anti_spam_enabled': None}, 'sender_chat': None, 'forward_from': None, 'forward_from_chat': None, 'forward_from_message_id': None, 'forward_signature': None, 'forward_sender_name': None, 'forward_date': None, 'is_automatic_forward': None, 'reply_to_message': None, 'via_bot': None, 'edit_date': None, 'has_protected_content': None, 'media_group_id': None, 'author_signature': None, 'text': '/start', 'entities': [<telebot.types.MessageEntity object at 0x7770137fd0>], 'caption_entities': None, 'audio': None, 'document': None, 'photo': None, 'sticker': None, 'video': None, 'video_note': None, 'voice': None, 'caption': None, 'contact': None, 'location': None, 'venue': None, 'animation': None, 'dice': None, 'new_chat_member': None, 'new_chat_members': None, 'left_chat_member': None, 'new_chat_title': None, 'new_chat_photo': None, 'delete_chat_photo': None, 'group_chat_created': None, 'supergroup_chat_created': None, 'channel_chat_created': None, 'migrate_to_chat_id': None, 'migrate_from_chat_id': None, 'pinned_message': None, 'invoice': None, 'successful_payment': None, 'connected_website': None, 'reply_markup': None, 'message_thread_id': None, 'is_topic_message': None, 'forum_topic_created': None, 'forum_topic_closed': None, 'forum_topic_reopened': None, 'has_media_spoiler': None, 'forum_topic_edited': None, 'general_forum_topic_hidden': None, 'general_forum_topic_unhidden': None, 'write_access_allowed': None, 'user_shared': None, 'chat_shared': None, 'json': {'message_id': 6450, 'from': {'id': 1004756967, 'is_bot': False, 'first_name': 'В отпуске', 'username': 'ocobash', 'language_code': 'ru'}, 'chat': {'id': 1004756967, 'first_name': 'В отпуске', 'username': 'ocobash', 'type': 'private'}, 'date': 1693667379, 'text': '/start', 'entities': [{'offset': 0, 'length': 6, 'type': 'bot_command'}]}}"

a = str(a)
a = a.replace("'", '"')
a = a.replace("[", "")
a = a.replace("]", "")
# a = json.loads(a)
#a = eval(a)
#a ast_eval(a)
print(a["from_user"]["id"])


Сам словарь полученный от телеграмм мне нужно его в нужном моменте сохранять в бд, а позже вытаскивать обратно превращая назад в dict, но все идет по наклонной
  • Вопрос задан
  • 119 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Сам словарь полученный от телеграмм мне нужно его в нужном моменте сохранять в бд, а позже вытаскивать обратно превращая назад в dict, но все идет по наклонной

Ну т.е. как и предсказывали, проблема в более раннем коде.
Когда сохраняешь в БД, делай не str(mydict), а json.dumps(mydict). Тогда можно будет делать json.loads() при загрузке.

Только словарь надо будет почистить от постороннего, а ещё лучше - сначала сделать свой словарь ,в который сохранять ТОЛЬКО то, что тебе надо. Например, ты не заметил, что у тебя в словаре есть
'entities': [<telebot.types.MessageEntity object at 0x7770137fd0>]

Сюрприз-сюрприз, объект
<telebot.types.MessageEntity object at 0x7770137fd0>
явно сериализации не поддаётся, и ни сохранить, ни восстановить его не выйдет. Или убирать ключ entities, если он тебе не нужен, или разбираться, что это за объект и сериализовывать/восстанавливать его вручную.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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