2014-09-28 3 views
1

Я пытаюсь генерировать base64 ИМГ QRCode с помощью Python 3 таким образом:Строка/Bytes проблема при обновлении с python2 до Python3

def gen_qrcode(data): 
    import base64 
    import io 
    import qrcode 

    qrc = qrcode.QRCode(version=1, 
         error_correction=qrcode.constants.ERROR_CORRECT_Q, 
         box_size=8, 
         border=4) 
    qrc.add_data(data) 
    qrc.make(fit=True) 
    img = qrc.make_image() 

    output = io.StringIO() 
    img.save(output, 'PNG') # This line is now a problem with Python 3 
    output.seek(0) 
    output_s = output.read() 
    b64 = base64.b64encode(output_s) 
    img_tag = '<img src="data:image/png;base64,{0}">'.format(b64) 

    return img_tag 

Он работал хорошо с Python 2 (только измененный код StringIO заменен IO), но теперь у меня есть ошибка:

TypeError at /qrcode 
string argument expected, got 'bytes' 
-> img.save(output, 'PNG') 

Любая идея? Спасибо.

ответ

4
output = io.BytesIO 

Это будет ожидать байты и создавать байты для ввода в base64.b64encode.

Чтобы удалить ведущую «Ъ» из полученного выхода .decode() должен быть использован, как указано в комментарии:

b64 = base64.b64encode(output_s).decode() 
+0

Это должно работать как в 2,7 и 3.x. Я считаю, что остальная часть вашего кода также не зависит от версии. –

+0

Это решает первое сообщение об ошибке, но на выходе это 'b'the-b64-string'' вместо' 'the-b64-string''. Это создало неверный URL-адрес. –

+1

Решенный, я добавил: .decode() (отредактирован ответ). Спасибо за помощь. –

Смежные вопросы