web-dev-qa-db-ja.com

Pythonファイルモード "w +"で混乱している

のドキュメント から、

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

and はこちら

w +:書き込みと読み込みの両方の目的でファイルを開きます。ファイルが存在する場合は、既存のファイルを上書きします。ファイルが存在しない場合は、読み書き用の新しいファイルを作成します。

しかし、w+で開かれたファイルを読み取る方法は?

159
holys

あなたがするべきであるように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()呼び出しはファイルの最後から読み込もうとし、空の文字列を返します。

101
rmunn

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

  • r

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

  • rB

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

  • r +

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

  • rB +

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

  • w

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

  • wB

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

  • w +

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

  • wb +

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

  • ある

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

  • ab

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

  • a +

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

  • ab +

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

333
Nullify

Pythonの全ファイルモード

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

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

2
Elazar

私はあなたが達成しようとしていると思うものを処理する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)

お役に立てれば..

1
Dory Zidon

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

0
SmartManoj

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
$
0
GraceMeng

実際には、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はそれらを陽電子(0,0)から隠します。

0
Find