組み込みオープン関数のモードa、a +、w、w +、r +の違いは?


610

内蔵のPythonでオープン機能、モード間の正確な違いは何ですかwaw+a+、とr+

特に、ドキュメンテーションは、これらすべてがファイルへの書き込みを許可することを意味し、特に「追加」、「書き込み」、および「更新」のためにファイルを開くと述べていますが、これらの用語の意味を定義していません。


11
指定したリンクは値を正確に定義します。あなたが提供したリンクのどの部分が見えなかったり理解できなかったりしましたか?質問を明確にして、リンクについて理解できなかったことを説明してください。
S.Lott 09/09/23


2
+記号の意味を説明する簡単な単一のドキュメントはありませんか?
チャーリーパーカー

回答:


740

開始モードは、C標準ライブラリ関数の場合とまったく同じfopen()です。

BSD fopenマンページでは、それらを次のように定義しています。

 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.

3
C標準ライブラリのfopen呼び出し(システムコールではない)を意味していると思います
Eli Courtwright 09/09/23

14
注:Python v3では、いくつかの追加モードが追加されています。 ドキュメントへのリンク
Alex

5
指摘wし、w+両方を行うことができますThe file is created if it does not exist
魏ヤン

4
Windowsでは、bモードに追加し、バイナリモードでファイルを開き、そのようなモードもあるrbwbr+b。Windows上のPythonでは、テキストファイルとバイナリファイルが区別されます。テキストファイルの行末文字は、データの読み取りまたは書き込み時に自動的にわずかに変更されます。

6
+それがそうであるならば、私は一貫した独立した何かをしないと言ってもいいですかawそれともr?それとも私はパターンを見ることに失敗していますか?パターンは何ですか?
チャーリーパーカー

510

モード間の主な違いが何であるかについての精神的なイメージを構築するためだけに、時々Googleを改めて開く必要があることに気づきました。なので、次回は図の方が読みやすいと思いました。たぶん他の誰かもそれが役に立つと思うでしょう。


3
a説明がある間違いました。書き込みは常に最後に配置されます。
Antti Haapala

10
@そして、@ AnttiはSubsequent writes to the file will always end up at the then current end of file, irrespective of any intervening fseek(3) or similar最初の位置が終わりであると言うよりも少し強いプロパティを参照していると思います。
jcai

8
@CharlieParker基本的に2つのファイル操作(読み取り、書き込み)があること。モードrは主に読み取り用、モードwaは主に書き込み用です。そしてプラス記号が第2の動作可能所与のモードのために(単に前記)。
Jeyekomon、

22
後世の場合:切り捨てとは、最初から上書きすることを意味します。
Minh Tran

4
@Jeyekomonここでのコメントの要約は、これらのモードを頭に入れて覚えられるようにするために読んだ中で、おそらく最も役立つものです。この回答のフローチャートは美しく、以下の回答の表はすばらしいですが、これらの回答(および他の場所での回答)がこの単純なポイントから始まり、そこから機能した場合、詳細を掛けるはるかに優れたメンタルフレームワークを提供するのに役立ちますオン。ほんとありがと。💯(私はこれはスパムの境界線上かもしれないですが、私はあなたのコメントは承認に値すると感じ承知している)
ティム・

206

同じ情報、表形式のみ

                  | r   r+   w   w+   a   a+
------------------|--------------------------
read              | +   +        +        +
write             |     +    +   +    +   +
write after seek  |     +    +   +
create            |          +   +    +   +
truncate          |          +   +
position at start | +   +    +   +
position at end   |                   +   +

意味は次のとおりです:(誤解を避けるために)

  • 読み取り-ファイルからの読み取りが許可されます
  • 書き込み-ファイルへの書き込みが許可されます

  • create-ファイルがまだ存在しない場合は作成されます

  • 切り捨て-ファイルを開く間、ファイルは空になります(ファイルのすべての内容が消去されます)

  • 先頭の位置-ファイルが開かれた後、初期位置はファイルの先頭に設定されます

  • 末尾の位置-ファイルが開かれた後、初期位置はファイルの末尾に設定されます

注:aa+、常にファイルの末尾に追加は-どんな無視seek動きを。
ところで。a+モードで開いた新しいファイルの少なくとも私のwin7 / python2.7での興味深い動作:-2
write('aa'); seek(0, 0); read(1); write('b')番目writeは無視されます-2
write('aa'); seek(0, 0); read(2); write('b')番目のwriteレイズIOError


10
「存在しない場合はファイルを作成します。存在する場合は、開始位置にして、読み取りと書き込みを有効にします」と表示されないのはなぜですか?これは、私にとって最も明白なユースケースです。データをファイルに格納しています。ファイルがそこにない場合は、エラーの代わりに作成してください。上からすべて読み取りたいファイルにデータがある場合は、いくつかのものを更新してから、次にロードするときにファイルを0から完全に再書き込みします。私はopen(file,'a'); close(); open(file,'r+')これを達成するために使用します。
ピンヘッド、2016

2
この文脈で「切り捨て」とはどういう意味ですか?
チャーリーパーカー

3
これは、ファイルのすべてのコンテンツは、(ファイルが空作られる)が消去されていることを意味@CharlieParker
industryworker3595112

1
を使用して手動でポインタを移動したかどうかに関係なく、with aおよびa+writesは常にファイルの最後で発生するというメモを追加することをお勧めしますseek()
Balu 2017年

1
Python 3の「x」を含めるためにテーブルを更新するのはどうですか?
Nikos Alexandris

39

オプションは、C標準ライブラリのfopen関数と同じです。

w ファイルを切り捨て、すでにそこにあったものを上書きします

a ファイルに追加し、すでにそこにあったものに追加します

w+ 読み取りと書き込みのために開き、ファイルを切り捨てますが、ファイルに書き込まれた内容を読み戻すこともできます

a+ 追加および読み取り用に開き、ファイルへの追加とその内容の読み取りの両方が可能


2
この文脈で「切り捨て」とはどういう意味ですか?古いデータがあれば削除するということですか?それとももっと具体的なものですか?
チャーリーパーカー

3
@CharlieParker:正解です。つまり、既存のファイル内のすべてのデータがドロップされ、空になったファイルの先頭から書き込みを開始します。
Eli Courtwright、2016

9

これは、クロスプラットフォームの実行、つまりCYAとして実行することを検討することが重要だと思います。:)

Windowsでは、モードに追加された「b」はバイナリモードでファイルを開くため、「rb」、「wb」、「r + b」などのモードもあります。WindowsのPythonでは、テキストファイルとバイナリファイルが区別されます。テキストファイルの行末文字は、データの読み取りまたは書き込み時に自動的にわずかに変更されます。ファイルデータに対するこの舞台裏の変更は、ASCIIテキストファイルでは問題ありませんが、JPEGファイルやEXEファイルのようなバイナリデータは破損します。そのようなファイルを読み書きするときは、バイナリモードを使用するように十分注意してください。Unixでは、モードに「b」を追加しても問題ないため、すべてのバイナリファイルに対してプラットフォームに依存せずに使用できます。

これはPython Software Foundation 2.7.xから直接引用されています。


9

なぜモード「w +」と「w」を使用するのかを理解するためにこれにぶつかりました。最後に、私はいくつかのテストを行いました。モード「w +」の目的はあまりわかりません。どちらの場合も、ファイルは最初から切り捨てられています。ただし、「w +」を使用すると、書き戻し後にシークして読み取ることができます。「w」を使用して読み取りを試行すると、IOErrorが発生します。モード 'w +'でシークを使用せずに読み取ると、ファイルポインターが書き込んだ場所の後にあるため、何も起こりません。

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