web-dev-qa-db-fra.com

TypeError: attend un objet tampon de caractère - lors de la tentative d'enregistrement d'un entier dans un fichier texte

J'essaie de faire un très simple 'compteur' censé garder trace du nombre de fois que mon programme a été exécuté.

Premièrement, j'ai un fichier texte qui ne comprend qu'un seul caractère: 0

Ensuite, j’ouvre le fichier, je l’analyse comme un int, j’ajoute 1 à la valeur, puis essayez de la renvoyer au fichier texte:

f = open('testfile.txt', 'r+')
x = f.read()
y = int(x) + 1
print(y)
f.write(y)
f.close()

J'aimerais que y écrase la valeur dans le fichier texte, puis la ferme.

Mais tout ce que je reçois, c'est TypeError: expected a character buffer object.

Modifier:

Essayer d'analyser y en tant que chaîne:

f.write(str(y))

donne

IOError: [Errno 0] Error
54
BSG

Avez-vous vérifié la docstring de write()? Ça dit:

write (str) -> None. Écrivez chaîne str dans le fichier.

Notez qu'en raison de la mise en mémoire tampon, flush () ou close () peuvent être nécessaires avant que le fichier sur le disque ne reflète les données écrites.

Vous devez donc convertir y en str en premier.

Notez également que la chaîne sera écrite à la position actuelle, qui se trouvera à la fin du fichier, car vous avez déjà lu l'ancienne valeur. Utilisez f.seek(0) pour aller au début du fichier.

Edit: Comme pour le IOError, ce problème semble lié. Une cite de là:

Pour les modes où la lecture et l’écriture (ou les ajouts) sont autorisés (ceux qui incluent un signe "+"), le flux doit être vidé (fflush) ou repositionné (fseek, fsetpos, rewind) entre une opération de lecture suivie d’un opération d'écriture ou une opération d'écriture suivie d'une opération de lecture.

Donc, je vous suggère d'essayer f.seek(0) et peut-être que le problème disparaîtra.

75
Lev Levitsky
from __future__ import with_statement
with open('file.txt','r+') as f:
    counter = str(int(f.read().strip())+1)
    f.seek(0)
    f.write(counter)
9
Burhan Khalid

Essayez juste le code ci-dessous:

Si je vois que vous avez inséré 'r +' ou que cette commande ouvre le fichier en mode lecture, vous ne pourrez donc pas y écrire; vous devez donc ouvrir le fichier en écriture 'w' si vous souhaitez écraser le contenu du fichier et y écrire nouvelles données, sinon vous pouvez ajouter des données au fichier en utilisant 'a'

J'espère que ça va aider;)

f = open('testfile.txt', 'w')# just put 'w' if you want to write to the file 

x = f.readlines() #this command will read file lines

y = int(x)+1

print y
z = str(y) #making data as string to avoid buffer error
f.write(z)

f.close()
0
salah Laaroussi