Кодирование строки в base64 в Python 2.x и Python 3.x

В 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, верно?

Я не спрашиваю "почему". Я спрашиваю, есть ли лучший способ справиться с этим простым случаем.

b64encode требуется байтовый объект в python3, поэтому вам нужно преобразовать строку в массив байтов перед его использованием.
rdas 09.05.2019 22:51

Проверьте stackoverflow.com/a/41437531/2209008 для хорошего объяснения того, почему это изменение было сделано. Если вы считаете, что это слишком многословно, просто оберните это в функцию.

Colin Basnett 09.05.2019 22:53

Итак, есть нет лучший способ сделать это в Python3, это то, что вы говорите?

Jon Red 09.05.2019 22:55

Не спрашивая «почему», я спрашиваю, есть ли лучший способ.

Jon Red 09.05.2019 22:58

Мне просто любопытно, что «ужасного» в пути Python3? Тот факт, что вы должны encode() это сначала до байтов? Это всего лишь дополнительный вызов, и он все еще находится в одной строке.

Gino Mempin 10.05.2019 02:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
6
3 583
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Так что лучше всегда субъективно. Лучшее решение для одного человека может стать кошмаром для другого. Для чего я написал вспомогательные функции для этого:

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

Лучше чем ничего. Я сделал что-то подобное, но он кодирует байты внутри самой функции. На самом деле должен быть лучший способ выполнить такое простое преобразование строки в строку.

Jon Red 12.07.2019 23:05

Другие вопросы по теме