web-dev-qa-db-ja.com

'str'は、Python2からのバッファーインターフェイスPython3をサポートしていません

こんにちは、Py2にはこの2つの機能がありますが、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
13
Daniel Domingo

修正は私にとって簡単でした

使用する

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

の代わりに

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

In python 3 'w'は必要なものであり、'wb'

21
Jimmy

Python 2、裸のリテラル文字列(例:'string')はbytesであるのに対し、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 への移植)、および バイト、文字列、Unicode セクションを参照してください。

13
ekhumoro