Как мне отформатировать это из str в байтоподобный объект? - PullRequest
0 голосов
/ 28 апреля 2018

Привет, у меня проблемы с декодированием этих имен файлов (они закодированы как base64). Я знаю, что они должны быть объектами, похожими на байты, но я не могу за всю жизнь сделать это так. Пожалуйста, помогите, много любви.

for filename in os.listdir('./Files'):
    name, typeId = base64.b64decode(filename.replace('.png', '')).split('_!_')

Ошибка:

name, typeId = base64.b64decode(filename.replace('.png', '')).split('_!_')
TypeError: a bytes-like object is required, not 'str'

1 Ответ

0 голосов
/ 28 апреля 2018

TypeError: требуется байтоподобный объект, а не 'str'

Вы, вероятно, получите эту ошибку из двух мест:

  1. b64decode(filename.replace('.png', ''))
    Как вы упомянули, b64decode ожидает байтовоподобный объект.
    Но filename - это str, а filename.replace также вернет str.

  2. .split('_!_')
    Поскольку b64decode будет возвращать байты, вы также должны передать байтовидный объект в split.

Попробуйте это:

for fname in os.listdir('./Files'):
    fname_bytes = os.fsencode(fname.replace('.png', ''))
    dec = base64.b64decode(fname_bytes)
    parts = dec.split(b"_!_")

Чтобы решить 1., вы можете использовать fsencode, как указано в os.listdir документах:

Примечание: Для кодирования str имен файлов в байтах используйте fsencode().

Чтобы решить 2., вы можете добавить префикс «b» к строке, чтобы сделать его байтовым литералом :

Литералы байтов всегда имеют префикс 'b' или 'B'; они производят экземпляр типа bytes вместо типа str.

...