TypeError: ожидается объект символьного буфера - при попытке сохранить целое число в текстовый файл
Я пытаюсь сделать очень простой "счетчик", который должен отслеживать, сколько раз моя программа была выполнена.
Во-первых, у меня есть текстовый файл, который включает только один символ: 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))
дает
IOError: [Errno 0] Error
Ответы
Ответ 1
Вы проверили docstring write()
? В нем говорится:
write (str) → None. Напишите строку str в файл.
Обратите внимание, что из-за буферизации может понадобиться flush() или close() файл на диске отражает записанные данные.
Итак, сначала вам нужно преобразовать y
в str
.
Также обратите внимание, что строка будет записана в текущей позиции, которая будет в конце файла, потому что вы уже прочитали старое значение. Используйте f.seek(0)
, чтобы перейти к началу файла.
Изменить: что касается IOError
, эта проблема, похоже, связана. Цитата оттуда:
Для режимов, в которых разрешены чтение и запись (или добавление) (те, которые содержат знак "+" ), поток следует очистить (fflush) или переместить (fseek, fsetpos, rewind) между чтением после чего следует операция записи или операция записи после чего выполняется операция чтения.
Итак, я предлагаю вам попробовать f.seek(0)
и, возможно, проблема исчезнет.
Ответ 2
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)
Ответ 3
Просто попробуйте код ниже:
Как я вижу, вы вставили "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()