web-dev-qa-db-fra.com

'str' ne prend pas en charge l'interface tampon Python3 de Python2

Salut, ces deux fonctions dans Py2 fonctionnent bien, mais cela ne fonctionne pas sur Py3

def encoding(text, codes):
    binary = ''
    f = open('bytes.bin', 'wb')
    for c in text:
        binary += codes[c]
    f.write('%s' % binary)
    print('Text in binary:', binary)
    f.close()
    return len(binary)

def decoding(codes, large):
    f = file('bytes.bin', 'rb')
    bits = f.read(large)
    tmp = ''
    decode_text = ''
    for bit in bits:
        tmp += bit
        if tmp in fordecodes:
            decode_text += fordecodes[tmp]
            tmp = ''
    f.close()
    return decode_text

La console affiche ceci:

Traceback (most recent call last):
  File "Practica2.py", line 83, in <module>
    large = encoding(text, codes)
  File "Practica2.py", line 56, in encoding
    f.write('%s' % binary)
TypeError: 'str' does not support the buffer interface
13
Daniel Domingo

La solution était simple pour moi

Utilisation

f = open('bytes.bin', 'w')

au lieu de

f = open('bytes.bin', 'wb') 

Dans python 3 'w' c'est ce dont vous avez besoin, pas 'wb'.

21
Jimmy

Dans Python 2, chaînes littérales nues (par exemple 'string') sont octets , alors qu'en Python 3 ils sont unicode Cela signifie que si vous voulez que les chaînes littérales soient traitées comme des octets dans Python 3, vous devez toujours les marquer explicitement comme telles.

Ainsi, par exemple, les premières lignes de la fonction encoding devraient ressembler à ceci:

binary = b''
f = open('bytes.bin', 'wb')
for c in text:
    binary += codes[c]
f.write(b'%s' % binary)

et il y a quelques lignes dans l'autre fonction qui nécessitent un traitement similaire.

Voir Portage vers Python , et la section Octets, chaînes et Unicode pour plus de détails.

13
ekhumoro