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
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'
.
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.