Ошибка типа: 'str' не поддерживает интерфейс буфера - PullRequest
10 голосов
/ 21 августа 2011
import hashlib

infile = open("P:\\r.mp3", 'r+b')
data = infile.readline()
hash = hashlib.md5()
hash.update(data)

hash_digest = hash.hexdigest()
print(hash_digest)
#hash_digest = hash_digest.encode('utf-8')
print(hash_digest)
with open("lt.txt", 'ab') as outfile:
    outfile.write(hash_digest + '\n')   #error here

with open("syncDB.txt", 'rb') as fg:
    for data in fg:
    print(data)
outfile.write(hash_digest + '\n')
TypeError: 'str' does not support the buffer interface

Как мне исправить это и что мне нужно научиться видеть меня в таких ситуациях?

Также, если я закодирую это в utf-8 (uncomment), это выдаст следующую ошибку:

TypeError: can't concat bytes to str

Ответы [ 2 ]

22 голосов
/ 21 августа 2011

Вы используете Python 3, где существует строгое разделение между текстом (str) и данными (bytes). Текст не может быть записан в файл, если вы сначала не закодировали его явно.

Есть два способа сделать это:

1) Откройте файл в текстовом режиме (возможно, с указанной кодировкой), чтобы строки автоматически кодировались для вас:

with open("lt.txt", 'at', encoding='utf8') as outfile:
    outfile.write(hash_digest + '\n') # or print(hash_digest, file=outfile)

Если вы не задаете кодировку самостоятельно при открытии файла в текстовом режиме, будет использоваться кодировка по умолчанию для вашей системы.

2) Кодируйте строки вручную, как вы пытались. Но не пытайтесь смешивать str с bytes, как вы, либо используйте байтовый литерал:

hash_digest = hash_digest.encode('utf-8')
with open("lt.txt", 'ab') as outfile:
    outfile.write(hash_digest + b'\n')   # note the b for bytes

или кодировать после добавления новой строки:

    outfile.write((hash_digest + '\n').encode('utf-8'))
0 голосов
/ 21 августа 2011

Вы должны выполнить поиск в Google для 'str' не поддерживает интерфейс буфера

У вас будет много ответов, подобных этому:

stackoverflow.com/questions/5471158/typeerror-str-does-not-support-the-buffer-interface

И для второй ошибки ** TypeError: невозможно объединить байты в str **, Я думаю, вы должны написать b'\n' в f.write(hex + '\n')

"" "edit

да Рош Оксиморон прав, b '\ n', а не u '\ n'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...