从Python2升级到Python3时出现字符串/字节

Dav*_* D. 3 python qr-code python-imaging-library python-3.x pillow

我尝试使用Python 3以这种方式生成base64 img的QRCode:

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
Run Code Online (Sandbox Code Playgroud)

它适用于Python 2(唯一更改的代码是由IO替换的StringIO)但现在我有一个错误:

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

任何的想法?谢谢.

Ter*_*edy 6

output = io.BytesIO
Run Code Online (Sandbox Code Playgroud)

这将期望字节并产生输入到base64.b64encode的字节.

要从结果输出中删除前导"b" .decode(),必须按照注释中的说明使用:

b64 = base64.b64encode(output_s).decode()
Run Code Online (Sandbox Code Playgroud)

  • 解决了,我补充说:.decode()(回答编辑).感谢帮助. (2认同)