'str' не поддерживает буферный интерфейс Python3 из Python2

Привет, эти две функции в Py2 отлично работают, но он не работает на 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

Консоль выдает следующее:

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

Ответ 1

Исправление было простым для меня

Используйте

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

вместо

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

В python 3 'w' это то, что вам нужно, а не 'wb'.

Ответ 2

В Python 2 голое строковые строки (например, 'string') - это байты, тогда как в Python 3 они являются unicode. Это означает, что если вы хотите, чтобы буквальные строки обрабатывались как байты в Python 3, вы всегда должны явно отмечать их как таковые.

Итак, например, первые несколько строк функции encoding должны выглядеть следующим образом:

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

и в другой функции есть несколько строк, которые нуждаются в подобной обработке.

Подробнее см. Портирование на Python 3 и раздел Bytes, Strings и Unicode.