pythonの組み込み関数であるopenにおいて,モードw
,a
,w+
,a+
,r+
の正確な違いは何ですか?
特に、ドキュメントでは、これらすべてがファイルへの書き込みを可能にすることを暗示しており、具体的には、"append"、"writing"、"update"のためにファイルを開くと書かれていますが、これらの用語が何を意味するのかは定義されていません。
オープニングモードは,C言語の標準ライブラリ関数fopen()
とまったく同じです。
BSD fopen
manpageでは以下のように定義されています。
The argument mode points to a string beginning with one of the following
sequences (Additional characters may follow these sequences.):
``r'' Open text file for reading. The stream is positioned at the
beginning of the file.
``r+'' Open for reading and writing. The stream is positioned at the
beginning of the file.
``w'' Truncate file to zero length or create text file for writing.
The stream is positioned at the beginning of the file.
``w+'' Open for reading and writing. The file is created if it does not
exist, otherwise it is truncated. The stream is positioned at
the beginning of the file.
``a'' Open for writing. The file is created if it does not exist. The
stream is positioned at the end of the file. Subsequent writes
to the file will always end up at the then current end of file,
irrespective of any intervening fseek(3) or similar.
``a+'' Open for reading and writing. The file is created if it does not
exist. The stream is positioned at the end of the file. Subse-
quent writes to the file will always end up at the then current
end of file, irrespective of any intervening fseek(3) or similar.
なぜモード 'w+'と 'w'を使い分けるのかを考えていたら、これにたどり着きました。結局、いくつかのテストをしてみました。モード 'w+'にはあまり意味がないように思います。しかし、 'w+'では、シークバックすることで、書き込み後に読み出すことができました。もし、 'w'で読み込みを行おうとすると、IOErrorが発生します。モード 'w+'でシークを使わずに読むと、ファイルポインタが書き込んだ後になるので、何も得られません。