2011-07-11 9 views
119

読み取りと書き込みの両方でファイルを開く方法はありますか?私は "r +"がそのためだと思った。
バイナリファイルに取り組んでいるので、 "r + b"モードを試しましたが、ファイルが読み込めないというエラーが表示されます。読み書き用ファイルを開いていますか?

+3

あなたが解決しているかの問題?おそらく、ファイルの書き込み/読み取りよりも優れた解決策があります。 'mmap' –

+1

私たちはあなたに答えることができるようにあなたのコードを教えてください。また、http://docs.python.org/tutorial/inputoutput.html#reading-and-writing-filesを見てみることもできます。しかし、私はr + bを使用しようとしており、それは動作します。 diff関数で1つのファイル記述子を使用する利点もありますか? –

答えて

30

r+は、同時に読み書きする標準モードです。これは、file()/open()がこのオペレーティングシステムコールの周りの小さなラッパーにすぎないので、fopen()システムコールを使用した場合と同じです。

16

私はこのような何かを試してみましたし、期待どおりに動作します:

f = open("c:\\log.log", 'r+b') 
f.write("\x5F\x9D\x3E") 
f.read(100) 
f.close() 

f.read(サイズ) - ファイルの内容を読み取るために、コールf.read(サイズ)、 はデータ量を読み込んで文字列として返します。

そして:

f.write(文字列) Noneを返さない、ファイルに文字列の内容を書き込みます。

あなたがPython tutorial about reading and writing filesを開いた場合にも、あなたがそれを見つける:

は 'r +' を読み取りと書き込みの両方のファイルを開きます。

Windowsでは、モードに追加された 'b'はファイルをバイナリモードで開きます。 'rb'、 'wb'、 'r + b'のようなモードもあります。

+4

また、 'r + b'モードを使用しても同じように読み書きができますが、f.read()とf.write()の間にf.seek(0)を使用して、カーソルをファイルの先頭に戻す必要があります。 – gaborous

+0

あなたが書いているデータが既にそこにあるデータよりも長ければ、それは切り捨てられないことに注意してください。これを止めるには 'truncate'メソッドを使います。 – Flimm

176

は、ここでは、ファイルを読み込む方法ですし、次に閉じて再度開くせずに、(既存のデータを上書き)、それに書き込む:

with open(filename, "r+") as f: 
    data = f.read() 
    f.seek(0) 
    f.write(output) 
    f.truncate() 
+15

ファイルが存在しない(作成される)エンドケースをカバーするために 'a +'を使用してください –

+9

seek()とtruncate()はどちらも重大です! – smwikipedia

+1

これはテキストを追加するためには機能しません。 – multigoodverse

関連する問題