#python #python-3.x
#python #python-3.x
Вопрос:
Я закодировал список идентификаторов, разделенных запятыми (например, "1,2,3"
), в base64, после чего возвращаемые данные из формы выглядят как x
показано ниже.
Я пробовал декодировать и кодировать всевозможные вещи, но, похоже, ничто не возвращает исходную строку.
x = "b'Mw=='"
base64.b64decode(x)
# b'lxcc'
x.decode()
# AttributeError: 'str' object has no attribute 'decode'
y = x.encode('utf-8')
print(y)
# b"b'Mw=='"
Чего мне не хватает?
Комментарии:
1.
base64.b64decode(b'Mw==')
. Предполагается, что это должны быть байты , а не строка.2. Удаляет двойные кавычки, т.е.
x = b'Mw=='
. Кроме того,b64decode
не изменяет исходную строку (строки неизменяемы). Он возвращает новую строку.3. Я не контролирую двойные цитаты, или это
xy
проблема. Форма, из которой я получаю данные, уже заключила байты в кавычки.4. Кто-то вызвал
str()
объект bytes вместоdecode()
, что приводит к нарушениюx
. Необходимо исправить это в восходящем потоке.5. @AndrasDeak вы правы, в конечном счете, это ошибка восходящего потока.
Ответ №1:
Если у вас есть b'...'
в ваших данных, это repr()
представление байтовой строки.
Если вы не можете заставить свой источник данных исправить их содержимое (это должно быть просто Mw==
: то, что они вам дают, не является допустимой кодировкой base64!), вы можете использовать ast.literal_eval()
для чтения ее в bytestring:
>>> import ast, base64
>>> x = "b'Mw=='"
>>> base64.b64decode(ast.literal_eval(x))
'3'
Комментарии:
1. Технически это решает проблему, но моя реальная проблема заключалась в том, что восходящий поток передавал мне неправильно закодированное
x
. Итак, я принимаю этот ответ для тех, кто не может контролировать восходящий поток, но в моем случае я смог исправить исходник восходящего потока и декодировать мою строку, как первоначально ожидалось.