TypeError: ожидал символьный буферный объект - при попытке сохранить целое число в текстовый файл - PullRequest
54 голосов
/ 20 марта 2012

Я пытаюсь сделать очень простой «счетчик», который должен отслеживать, сколько раз моя программа была выполнена.

Во-первых, у меня есть текстовый файл, который содержит только один символ: 0

Затем я открываю файл, анализирую его как int, добавляю 1 к значению и затем пытаюсь вернуть его в текстовый файл:

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

Я бы хотел, чтобы y перезаписал значение в текстовом файле, а затем закрыл его.

Но все, что я получаю, это TypeError: expected a character buffer object.

Edit:

Пытается разобрать y как строку:

f.write(str(y))

1025 * дает *

IOError: [Errno 0] Error

Ответы [ 3 ]

75 голосов
/ 20 марта 2012

Вы проверили строку документации write()?Там написано:

write (str) -> None.Записать строку str в файл.

Обратите внимание, что из-за буферизации может потребоваться flush () или close (), прежде чем файл на диске отобразит записанные данные.

Так что вам нужносначала преобразовать y в str.

Также обратите внимание, что строка будет записана в текущей позиции, которая будет в конце файла, поскольку вы уже прочитали старое значение.Используйте f.seek(0), чтобы перейти к началу файла.

Редактировать: Что касается IOError, , то эта проблема кажется связанной.Цитата оттуда:

Для режимов, в которых разрешено как чтение, так и запись (или добавление) (те, которые включают знак "+"), поток должен быть очищен (fflush) или перемещен (fseek, fsetpos, rewind) между операцией чтения с последующей операцией записи или операцией записи с последующей операцией чтения.

Итак, я предлагаю вам попробовать f.seek(0), и, возможно, проблема исчезнет.

9 голосов
/ 20 марта 2012
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)
0 голосов
/ 17 мая 2014

Просто попробуйте следующий код:

Как я вижу, вы вставили 'r +' или эта команда открыла файл в режиме чтения, чтобы вы не могли записать в него, поэтому вам нужно открыть файл врежим записи 'w', если вы хотите перезаписать содержимое файла и записать новые данные, в противном случае вы можете добавить данные в файл, используя 'a'

. Надеюсь, это поможет;)

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()
...