Python: преобразовать словарь в байты

#python #dictionary

#python #словарь

Вопрос:

Я пытаюсь преобразовать словарь в байты, но сталкиваюсь с проблемами при преобразовании его в правильный формат.

Во-первых, я пытаюсь сопоставить словарь с пользовательской схемой. Схема определяется следующим образом —

 class User:
    def __init__(self, name=None, code=None):
        self.name = name
        self.code = code

class UserSchema:
    name = fields.Str()
    code = fields.Str()

@post_load
 def create_userself, data):
    return User(**data)
  

Структура моего словаря следующая-

 user_dict = {'name': 'dinesh', 'code': 'dr-01'} 
  

Я пытаюсь сопоставить словарь с пользовательской схемой с помощью приведенного ниже кода

 schema = UserSchema(partial=True)
user = schema.loads(user_dict).data
  

При выполнении schema.loads ожидает, что входные данные будут str, bytes или bytearray. Ниже приведены шаги, которые я выполнил, чтобы преобразовать словарь в байты

 import json
user_encode_data = json.dumps(user_dict).encode('utf-8')
print(user_encode_data)
  

Вывод:

 b'{"name ": "dinesh", "code ": "dr-01"}
  

Если я попытаюсь сопоставить со схемой, я не получу требуемый объект схемы. Но, если у меня есть выходные данные в формате, приведенном ниже, я могу получить правильный объект схемы.

 b'{n  "name": "dinesh",n  "code": "dr-01"}n'
  

Есть предложения, как я могу преобразовать словарь в байты?

Ответ №1:

Вы можете использовать indent опцию в json.dumps() для получения n символов:

 import json

user_dict = {'name': 'dinesh', 'code': 'dr-01'}
user_encode_data = json.dumps(user_dict, indent=2).encode('utf-8')
print(user_encode_data)
  

Вывод:

 b'{n  "name": "dinesh",n  "code": "dr-01"n}'
  

Комментарии:

1. Нам это не нужно, indent=2 поэтому json.dumps(user_dict).encode('utf-8') будет достаточно

2. Самый красивый способ: json.dumps(user_dict, indent=4, separators=(',', ': ')).encode('utf-8')

Ответ №2:

Вы можете использовать библиотеку Base64 для преобразования словаря строк в байты, и хотя вы можете преобразовать результат в байтах в словарь, используя библиотеку json. Попробуйте приведенный ниже пример кода.

 import base64
import json


input_dict = {'var1' : 0, 'var2' : 'some string', 'var1' : ['listitem1','listitem2',5]}

message = str(input_dict)
ascii_message = message.encode('ascii')
output_byte = base64.b64encode(ascii_message)

msg_bytes = base64.b64decode(output_byte)
ascii_msg = msg_bytes.decode('ascii')
# Json library convert stirng dictionary to real dictionary type.
# Double quotes is standard format for json
ascii_msg = ascii_msg.replace("'", """)
output_dict = json.loads(ascii_msg) # convert string dictionary to dict format

# Show the input and output
print("input_dict:", input_dict, type(input_dict))
print()
print("base64:", output_byte, type(output_byte))
print()
print("output_dict:", output_dict, type(output_dict))
  

Вывод:

 >>> print("input_dict:", input_dict, type(input_dict))
input_dict: {'var1': ['listitem1', 'listitem2', 5], 'var2': 'some string'} <class 'dict'>
>>> print()

>>> print("base64:", output_byte, type(output_byte))
base64: b'eyd2YXIxJzogWydsaXN0aXRlbTEnLCAnbGlzdGl0ZW0yJywgNV0sICd2YXIyJzogJ3NvbWUgc3RyaW5nJ30=' <class 'bytes'>
>>> print()

>>> print("output_dict:", output_dict, type(output_dict))
output_dict: {'var1': ['listitem1', 'listitem2', 5], 'var2': 'some string'} <class 'dict'>