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

Comment puis-je corriger cela et que dois-je apprendre à me voir à travers ces situations?TypeError: « str » ne prend pas en charge l'interface tampon

Aussi, si j'encode ceci dans utf-8 (uncomment) il donne l'erreur suivante:

TypeError: can't concat bytes to str 

Répondre

17

Vous utilisez Python 3, où il y a une division stricte entre le texte (str) et des données (bytes). Le texte ne peut pas être écrit dans un fichier si vous ne l'avez pas encodé explicitement en premier.

Il y a deux façons de le faire:

1) Ouvrez le fichier en mode texte (éventuellement avec un codage spécifié) de sorte que les chaînes sont encodées automatiquement pour vous:

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

Si vous ne Ne spécifiez pas l'encodage vous-même lors de l'ouverture du fichier en mode texte, l'encodage par défaut de vos paramètres régionaux du système serait utilisé.

2) Encodez les chaînes manuellement comme vous l'avez essayé. Mais ne pas essayer de mélanger str avec bytes comme vous l'avez fait, utilisez un octet littéral:

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 

ou encode après avoir ajouté la nouvelle ligne:

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

Vous n'avez pas besoin d'appeler f.close() si vous utilisez with-open-as. (Bien sûr, je réalise que vous correspondiez simplement au code de l'OP.) – DSM

+0

Merci! J'ai eu un problème avec 'csv.writer',' writer.writerow' avec la même erreur. J'ai rencontré des problèmes pour passer de sys.stdout au fichier 'open()'. Votre solution a résolu mes problèmes :). –

Questions connexes