読み取りと書き込みの両方でファイルを開く方法は?


211

読み取りと書き込みの両方でファイルを開く方法はありますか?

回避策として、ファイルを書き込み用に開き、閉じてから、もう一度開いて読み取ります。しかし読み取りと書き込みの両方でファイルを開く方法はありますか?


3
あなたはどんな問題を解決していますか?おそらく、ファイルの書き込み/読み取りよりも優れた解決策があります。たとえば、mmap
Roman Bodnarchuk

1
コードを教えていただけますか。docs.python.org/tutorial/…を見てみることもできます。しかし、私はr + bを使用しようとしましたが、うまくいきます。また、diff関数で1つのファイル記述子を使用する利点はありますか?
Artsiom Rudzenka

@RomanBodnarchuk mmapは素晴らしいアイデアですが、並行性に対処する必要がある場合はどうでしょうか。アクセスを予約する方法はありますか?
Dr_Zaszuś

回答:


267

ファイルを読み取ってから、閉じて再度開くことなく、既存のデータを上書きする方法を次に示します。

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

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

16
seek()とtruncate()はどちらも重要です!
smwikipedia

4
@JossefHarushのドキュメントでaは、「一部のUnixシステムでは、現在のシーク位置に関係なく、すべての書き込みがファイルの末尾に追加されることを意味しています」と記されています。この場合、f.seek(0)は期待どおりに機能しません。私はLinuxでこれに反しました。
Graeme

6
それはあなたが理由を説明する方が良いでしょうseekし、truncateここで使用されます。ほとんどの読者はグーグルから来て、コピーして貼り付けます。
Shiplu Mokaddim

8
ファイルを読み取った後、ファイルポインター(fp)が前に移動したので、ファイルポインターを最初に設定する必要があります。つまりseek(0)、fpを位置0つまり、先頭)に配置します。指定されたtruncate()バイト数にファイルを切り捨てます。つまり、指定されたバイト数の後のすべてのファイルコンテンツを削除します。あなたのファイルに文字列がHello, worldあり、あなたが書くと想像してくださいBye。そうしないとtruncate()最後のコンテンツになりますByelo, worldあなたがファイルに存在していたテキストを削除したことがないことから、。truncate()ファイルを現在のfpに切り捨てます。
Illya Gerasymchuk

48

r+読み取りと書き込みを同時に行うための正規モードです。/ はこのオペレーティングシステムコールの小さなラッパーにすぎないため、これはfopen()システムコールの使用と同じです。file()open()


最初から書き込むのではなく、ファイルの内容を追加します
TomSawyer

47

I / O動作を要約する

|          Mode          |  r   |  r+  |  w   |  w+  |  a   |  a+  |
| :--------------------: | :--: | :--: | :--: | :--: | :--: | :--: |
|          Read          |  +   |  +   |      |  +   |      |  +   |
|         Write          |      |  +   |  +   |  +   |  +   |  +   |
|         Create         |      |      |  +   |  +   |  +   |  +   |
|         Cover          |      |      |  +   |  +   |      |      |
| Point in the beginning |  +   |  +   |  +   |  +   |      |      |
|    Point in the end    |      |      |      |      |  +   |  +   |

そして決定ブランチ

ここに画像の説明を入力してください


ツリー図を作成するためにどのソフトウェアを使用しましたか?
フラックス

私も興味がある-Dia?
nerdoc

22

私はこのようなものを試しましたが、期待どおりに動作します:

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

どこ:

f.read(size)-ファイルの内容を読み取るには、f.read(size)を呼び出します。これは、ある程度の量のデータを読み取り、それを文字列として返します。

そして:

f.write(string)は、stringの内容をファイルに書き込み、Noneを返します。

また、ファイルの読み書きに関するPythonチュートリアルを開くと、次のことがわかります。

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

Windowsでは、モードに追加された「b」はバイナリモードでファイルを開くため、「rb」、「wb」、「r + b」などのモードもあります。


5
また、読み取りと書き込みは「r + b」モードでも同じように機能しますが、カーソルをファイルの先頭に戻すには、f.read()とf.write()の間でf.seek(0)を使用する必要があります。
12

2
書き込んでいるデータがすでにそこにあるデータよりも長くない場合、データは切り捨てられないことに注意してください。truncateメソッドを使用してこれを停止します。
Flimm 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.