web-dev-qa-db-ja.com

TypeError:文字バッファーオブジェクトが必要-整数をテキストファイルに保存しようとしているとき

私はvery単純な「カウンター」を作成しようとしていますが、これはプログラムが実行された回数を追跡することになっています。

最初に、1文字のみを含むテキストファイルがあります: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です。

編集:

yを文字列として解析しようとしています:

f.write(str(y))

与える

IOError: [Errno 0] Error
54
BSG

write()のドキュメント文字列を確認しましたか?それは言います:

write(str)->なし。文字列strをファイルに書き込みます。

バッファリングのため、ディスク上のファイルが書き込まれたデータを反映する前に、flush()またはclose()が必要になる場合があることに注意してください。

したがって、最初にystrに変換する必要があります。

また、文字列はファイルの最後にある現在の位置に書き込まれることに注意してください。これは、古い値をすでに読み取っているためです。 f.seek(0)を使用して、ファイルの先頭に移動します。

編集:IOErrorに関しては、 この問題 は関連しているようです。そこからの引用:

読み取りと書き込み(または追加)の両方が許可されているモード(「+」記号を含むモード)の場合、読み取り操作とその後に続く書き込み操作、または書き込み操作とそれに続く読み取り操作。

ですから、f.seek(0)を試してみることをお勧めします。おそらく問題はなくなるでしょう。

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

以下のコードを試してください:

ご覧のように、「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()
0
salah Laaroussi