2011-08-21 13 views
6
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 

¿Cómo puedo corregir eso y lo que necesito para aprender a verme a través de estas situaciones?TypeError: 'str' no es compatible con la interfaz de memoria intermedia

también si esta codifican en UTF-8 (descomentar) da el siguiente error:

TypeError: can't concat bytes to str 

Respuesta

17

Estás usando Python 3, donde hay una división estricta entre el texto (str) y datos (bytes). El texto no puede escribirse en un archivo si no lo codifica explícitamente primero.

Hay dos maneras de hacer esto:

1) abrir el archivo en modo texto (posiblemente con una codificación especifica) para que las cadenas se codifican automáticamente para usted:

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

Si Don 't especifique la codificación usted mismo al abrir el archivo en modo texto, se utilizará la codificación predeterminada de la configuración regional del sistema.

2) Codifique las cadenas manualmente como lo intentó. Pero no trate de mezclar con strbytes igual que lo hizo, o bien utilizar un byte literal:

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 

o codificar después de añadir la nueva línea:

outfile.write((hash_digest + '\n').encode('utf-8')) 
+2

No necesita llamar a f.close() si está utilizando with-open-as. (Por supuesto, me doy cuenta de que simplemente estaba haciendo coincidir el código del OP.) – DSM

+0

¡Gracias! Tuve un problema con 'csv.writer',' writer.writerow' con el mismo error. He encontrado problemas al cambiar de Sys.stdout al archivo 'open()'. Tu solución resolvió mis problemas :). –

Cuestiones relacionadas