2011-08-21 17 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 

Come faccio a correggere questo e quello che ho bisogno di imparare a vedere me attraverso queste situazioni?TypeError: 'str' non supporta l'interfaccia buffer di

Anche se mi codificare questo in UTF-8 (decommentare) dà il seguente errore:

TypeError: can't concat bytes to str 

risposta

17

Si sta utilizzando Python 3, in cui v'è una rigida divisione tra testo (str) e dei dati (bytes). Il testo non può essere scritto su un file se non lo si codifica esplicitamente per primo.

Ci sono due modi per farlo:

1) aprire il file in modalità testo (possibilmente con una codifica specificato) in modo che le stringhe sono codificati automaticamente per voi:

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

Se don Se si specifica la codifica in modo autonomo quando si apre il file in modalità testo, verrà utilizzata la codifica predefinita delle impostazioni locali del sistema.

2) Codifica le stringhe manualmente come hai provato. Ma non provate a mescolare str con bytes come hai fatto, utilizzare un byte letterale:

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 codificare dopo l'aggiunta del ritorno a capo:

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

Non è necessario chiamare f.close() se si utilizza con-open-as. (Naturalmente capisco che stavi semplicemente abbinando il codice dell'OP.) – DSM

+0

Grazie! Ho avuto problemi con 'csv.writer',' writer.writerow' con lo stesso errore. Ho riscontrato problemi nel passaggio da sys.stdout a file 'open()'. La tua soluzione ha risolto i miei problemi :). –

Problemi correlati