В Python 2 я мог сделать это:
>>> var='this is a simple string'
>>> var.encode('base64')
'dGhpcyBpcyBhIHNpbXBsZSBzdHJpbmc=\n'
Легкий! К сожалению, это не работает в Python 3. К счастью, мне удалось найти альтернативный способ сделать то же самое в Python 3:
>>> var='this is a simple string'
>>> import base64
>>> base64.b64encode(var.encode()).decode()
'dGhpcyBpcyBhIHNpbXBsZSBzdHJpbmc='
Но это ужасно! Там должен быть лучший способ! Итак, я немного покопался и нашел второй, альтернативный метод выполнения того, что раньше было очень простой задачей:
>>> var='this is a simple string'
>>> import codecs
>>> codecs.encode(var.encode(),"base64_codec").decode()
'dGhpcyBpcyBhIHNpbXBsZSBzdHJpbmc=\n'
Это еще хуже! Меня не волнует завершающая новая строка! Что меня волнует, так это то, что должен — лучший способ сделать это в Python 3, верно?
Я не спрашиваю "почему". Я спрашиваю, есть ли лучший способ справиться с этим простым случаем.
Проверьте stackoverflow.com/a/41437531/2209008 для хорошего объяснения того, почему это изменение было сделано. Если вы считаете, что это слишком многословно, просто оберните это в функцию.
Итак, есть нет лучший способ сделать это в Python3, это то, что вы говорите?
Возможный дубликат Зачем мне нужно «b» для кодирования строки Python с помощью Base64?
Не спрашивая «почему», я спрашиваю, есть ли лучший способ.
Мне просто любопытно, что «ужасного» в пути Python3? Тот факт, что вы должны encode() это сначала до байтов? Это всего лишь дополнительный вызов, и он все еще находится в одной строке.






Так что лучше всегда субъективно. Лучшее решение для одного человека может стать кошмаром для другого. Для чего я написал вспомогательные функции для этого:
import base64
def base64_encode(string: str) -> str:
'''
Encodes the provided byte string into base64
:param string: A byte string to be encoded. Pass in as b'string to encode'
:return: a base64 encoded byte string
'''
return base64.b64encode(string)
def base64_decode_as_string(bytestring: bytes) -> str:
'''
Decodes a base64 encoded byte string into a normal unencoded string
:param bytestring: The encoded string
:return: an ascii converted, unencoded string
'''
bytestring = base64.b64decode(bytestring)
return bytestring.decode('ascii')
string = b'string to encode'
encoded = base64_encode(string)
print(encoded)
decoded = base64_decode_as_string(encoded)
print(decoded)
При запуске выдает следующее:
b'c3RyaW5nIHRvIGVuY29kZQ=='
string to encode
Лучше чем ничего. Я сделал что-то подобное, но он кодирует байты внутри самой функции. На самом деле должен быть лучший способ выполнить такое простое преобразование строки в строку.
b64encodeтребуется байтовый объект в python3, поэтому вам нужно преобразовать строку в массив байтов перед его использованием.