Pythonファイルモード「w +」で混乱


201

ドキュメントから、

モード「r +」、「w +」、および「a +」は、更新のためにファイルを開きます(「w +」はファイルを切り捨てます)。バイナリファイルとテキストファイルを区別するシステムで、ファイルをバイナリモードで開くには、モードに「b」を追加します。この区別がないシステムでは、「b」を追加しても効果はありません。

そしてここ

w +:書き込みと読み取りの両方のためにファイルを開きます。ファイルが存在する場合、既存のファイルを上書きします。ファイルが存在しない場合は、読み取りおよび書き込み用に新しいファイルを作成します。

しかし、どのようにして開いたファイルを読み取るのですw+か?


27
私が見つかりました。この図は非常に便利。
Ritwik、2018年

回答:


132

本来あるwithべきステートメントでファイルを開いているとしましょう。次に、次のようにしてファイルから読み取ります。

with open('somefile.txt', 'w+') as f:
    # Note that f has now been truncated to 0 bytes, so you'll only
    # be able to read data that you write after this point
    f.write('somedata\n')
    f.seek(0)  # Important: return to the top of the file before reading, otherwise you'll just read an empty string
    data = f.read() # Returns 'somedata\n'

これに注意してくださいf.seek(0)-これを忘れると、f.read()呼び出しはファイルの最後から読み取ろうとし、空の文字列を返します。


1
「0バイトに切り捨てる」とはどういう意味ですか?
Nasif Imtiaz Ohi

22
@NasifImtiazOhi-Pythonのドキュメントによると、w+「ファイルが存在する場合、既存のファイルを上書きします」。したがって、でファイルを開くとすぐに、ファイルw+は空のファイルになります。0バイトが含まれています。以前はデータが含まれていた場合、そのデータは切り捨てられて(切り取られて捨てられ)、ファイルサイズは0バイトになり、でファイルを開く前に存在していたデータを読み取ることができなくなりましたw+。以前のデータを実際に読み取って追加したい場合は、r+ではなくを使用してくださいw+
rmunn

上に新しいデータを追加する方法は?
Beqa Bukhradze

1
@BeqaBukhradze-質問がある場合は、[質問する]ボタンをクリックすると、何百人ものユーザーに表示されます。[コメントを追加]ボタンをクリックしないでください。1人または2人だけがコメントを見ることができます。
rmunn 2018

430

ファイルを開くさまざまなモードのリストを次に示します。

  • r

    読み取り専用でファイルを開きます。ファイルポインタはファイルの先頭に置かれます。これがデフォルトのモードです。

  • RB

    バイナリ形式でのみ読み取るためにファイルを開きます。ファイルポインタはファイルの先頭に置かれます。これがデフォルトのモードです。

  • r +

    読み取りと書き込みの両方のためにファイルを開きます。ファイルポインタはファイルの先頭にあります。

  • rb +

    バイナリ形式でファイルを読み取りと書き込みの両方で開きます。ファイルポインタはファイルの先頭にあります。

  • w

    書き込み専用でファイルを開きます。ファイルが存在する場合、ファイルを上書きします。ファイルが存在しない場合は、書き込み用に新しいファイルを作成します。

  • wb

    バイナリ形式でのみ書き込むためにファイルを開きます。ファイルが存在する場合、ファイルを上書きします。ファイルが存在しない場合は、書き込み用に新しいファイルを作成します。

  • w +

    書き込みと読み取りの両方のためにファイルを開きます。ファイルが存在する場合、既存のファイルを上書きします。ファイルが存在しない場合は、読み取りおよび書き込み用に新しいファイルを作成します。

  • wb +

    バイナリ形式で書き込みと読み取りの両方のためにファイルを開きます。ファイルが存在する場合、既存のファイルを上書きします。ファイルが存在しない場合は、読み取りおよび書き込み用に新しいファイルを作成します。

  • a

    追加するファイルを開きます。ファイルが存在する場合、ファイルポインタはファイルの末尾にあります。つまり、ファイルは追加モードです。ファイルが存在しない場合は、書き込み用の新しいファイルを作成します。

  • ab

    バイナリ形式で追加するファイルを開きます。ファイルが存在する場合、ファイルポインタはファイルの末尾にあります。つまり、ファイルは追加モードです。ファイルが存在しない場合は、書き込み用の新しいファイルを作成します。

  • a +

    追加と読み取りの両方のためにファイルを開きます。ファイルが存在する場合、ファイルポインタはファイルの末尾にあります。ファイルは追加モードで開きます。ファイルが存在しない場合は、読み書き用の新しいファイルを作成します。

  • ab +

    追加と読み取りの両方のファイルをバイナリ形式で開きます。ファイルが存在する場合、ファイルポインタはファイルの末尾にあります。ファイルは追加モードで開きます。ファイルが存在しない場合は、読み書き用の新しいファイルを作成します。


したがって、すべての集中的な目的で、r +とw +は同じですか?
Nick Humrich 14

21
@Humdinger:いいえ、w+新しいファイルを作成するか、既存のファイルを切り捨ててから、読み取りと書き込みのために開きます。r+読み書きのために切り捨てることなく既存のファイルを開きます。非常に異なります。
abarnert 2014

また、@ AlokAgarwalの回答と同様に、これはモードの完全なリストであると主張していますが、そうではありません。
abarnert 2014

1
複数のパラメーターを持つ関数のように機能するため、モードの完全なリストを提供するのはばかげています。rwまたはa排他的であるが、b缶として、それらのいずれかに追加することができ+、またはUそれは組み合わせ爆発です...。
rmunn 2014年

4
rbデフォルトのモードではありません、quote:The most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r' docs.python.org/2/library/functions.html#open
iggy

158

Pythonのすべてのファイルモード

  • r 読書のために
  • r+ 読み取りおよび書き込み用に開く(ファイルを切り捨てることはできません)
  • w 書くために
  • w+ 書き込みおよび読み取り用(ファイルを切り捨てることができます)
  • rbバイナリファイルを読み取るため。ファイルポインタはファイルの先頭に置かれます。
  • rb+ バイナリファイルの読み取りまたは書き込み
  • wb+ バイナリファイルの書き込み
  • a+ 追加用に開く
  • ab+バイナリでの追加と読み取りの両方のためにファイルを開きます。ファイルが存在する場合、ファイルポインタはファイルの末尾にあります。ファイルは追加モードで開きます。
  • x 排他的作成のために開く、ファイルがすでに存在する場合は失敗する(Python 3)

5
これはすべてのモードではありません。それは例えば、無視、rbそしてwbもちろんのこと、U2.xでのモードとt(両方のすべてのものを除くと組み合わせることができる3.xではモードb)。
abarnert 2014

1
r +とw +の違いは、w +は開いたときにファイルを切り捨てることです。ただし、両方のモードで手動で切り捨てることができます。
マーティン

1
この回答は、@ 200 OKによって与えられた回答と一致しませwb+ん。たとえば、ファイルからも読み取りますか?
Celeritas 2015

@Celeritas wbは、ファイルがバイナリモードで書き込むために開かれていることを示します。Unixシステム(Linux、Mac OS Xなど)では、バイナリモードでは何も行われません。テキストファイルは他のファイルと同じように扱われます。ただし、Windowsでは、テキストファイルはわずかに変更された行末で書き込まれます。これは、exeファイルやjpgファイルなどの実際のバイナリファイルを処理するときに深刻な問題を引き起こします。したがって、Unixであっても、テキストではないファイルを開く場合は、wbまたはrbを使用する必要があります。テキストファイルに対してのみ、プレーンwまたはrを使用します。
Alok Agarwal

Python 3には、「x」オープンモードもあります。排他的な作成のためにオープンし、ファイルがすでに存在する場合は失敗します。ドキュメントのopen関数を参照してください。
Laurent LAPORTE 2016年

9

r 読むために

w 書き込み用

r+ ファイルが存在する場合は元のコンテンツを削除せずに読み取り/書き込み用、そうでない場合は例外を発生

w+ 元のコンテンツを削除し、ファイルが存在する場合は読み取り/書き込み、それ以外の場合はファイルを作成

例えば、

>>> with open("file1.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file1.txt", "w+") as f:
...   f.write("c")
... 

$ cat file1.txt 
c$
>>> with open("file2.txt", "r+") as f:
...   f.write("ab\n")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'file2.txt'
>>> with open("file2.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file2.txt", "r+") as f:
...   f.write("c")
... 

$ cat file2.txt 
cb
$

2

ファイルは切り捨てられるため、呼び出すことはできますがread()( 'w'を使用して開いた場合とは異なり、例外は発生しません)、空の文字列が返されます。


2

あなたが達成しようとしていると私が思うことを処理するには、2つの方法があると思います。

1)明らかですが、ファイルを読み取り専用で開き、メモリに読み込んでから、tでファイルを開き、変更を書き込みます。

2)低レベルのファイル処理ルーチンを使用します。

# Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC
 fd = os.open(filename, os.O_RDWR | os.O_CREAT)

お役に立てれば..


それから何のために r+
SmartManoj

1

実際、r+モードに関する他のすべての答えには何か問題があります。

test.in ファイルの内容:

hello1
ok2
byebye3

そして、pyスクリプトの:

with open("test.in", 'r+')as f:
    f.readline()
    f.write("addition")

実行すると、test.inのコンテンツが次のように変更されます。

hello1
ok2
byebye3
addition

ただし、スクリプトを次のように変更すると、

with open("test.in", 'r+')as f:
    f.write("addition")

これtest.inも応答します:

additionk2
byebye3

したがって、このr+モードでは、読み取り操作を行わなかった場合でも、コンテンツを最初からカバーできます。そして、何らかの読み取り操作を実行f.write()すると、ファイルに追加されるだけです。

ちなみに、f.seek(0,0)以前のf.write(write_content)場合、write_contentはpositon(0,0)からそれらをカバーします。


0

h4z3で述べたように、実用的には、データが大きすぎてすべてを直接ロードできない場合や、ジェネレーターやリアルタイムの受信データがある場合は、w +を使用してファイルに保存し、後で読み取ることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.