Python 読み込み書き込みモード w+ r+

Python学習【365日チャレンジ!】93日目のマスターU(@Udemy11)です。

庭の雑草が生え放題だったので、意地になって抜いていたら、腰が痛くて腰の曲がったおばあさんみたいになってしまいました。

以前から、農作業をするおばあさんって、なんであんなに腰が曲がっちゃってるんだろうと思っていたのですが、おばあさんの気持ちが少しわかるようになりました。

曲がったままだと痛みがあまり無いのですが、背筋をピンと伸ばそうとすると、めっちゃ腰がいたいんですよね。

痛いのは嫌なので、ずっと曲がったままにしているうちに、背筋をまっすぐできなくなっちゃうんだろうなと感じました。

ほんと、年を取るといろいろなところにガタがくるようになります。

それではさっそくPython学習をはじめましょう!

昨日の復習

昨日は、seekを使った読み込み位置の移動などについて学習しました。

これまでもprint出力の結果がNoneだったりすることがあったので、なんとなく、読み込んだあとは、読み込み位置が移動しているんだろうなということは感じていました。

昨日学習したseekは、読み込み位置を移動するというメソッドだったので、より理解が深まったような気がします。

with open('text.txt', 'w') as f:
    f.write('aaa\nbbb\nccc\nddd')

with open('text.txt', 'r') as f:
    print(f.tell())
    f.seek(4)
    print(f.read(2))
    print(f.tell())

出力結果

0
bb
6

tell()は、現在のカーソル位置(読み込み位置)を読み込むメソッドです。

seekで読み込み位置を4に移動したあと、2つ文字を読み込んで、その後さらにtellで読み込み位置を確認しています。

seekを使った読み込み位置の移動については、昨日の記事をごらんください。

それでは本日のPython学習をすすめていきましょう!

‘w+’で書き込み・読み込み

'w'モードでファイルを上書きできましたが、そのまま読み込もうとすると、エラーが起こります。

with open('text.txt', 'w') as f:
    f.write('aaa\nbbb\nccc\nddd')
    print(f.read())

このコードだと、上書きモードなので、読み込むことはできません。

ただ、昨日の復習で記載したコードのように、もう一度withステートメントを使って、【text.txt】を読み込みモードで開けば読み込むことができます。

とはいえ、2回もwithステートメントを記述するのは面倒ですよね。

そこで、書き込みと読み込みを一緒にすることができる'w+'モードでファイルを開くことで、書き込みのあと読み込むことが可能になります。

with open('text.txt', 'w+') as f:
    f.write('aaa\nbbb\nccc\nddd')
    print(f.read())

ただ、このままだと、カーソル位置(読み込み位置)が書き込み終わったところにいってしまってるので、print出力後の改行だけが表示されて、書き込まれた文字列は出力されません。

どうするかというとすでに昨日の学習で習ったseekで書き込んだあとの読み込み位置を0の位置まで戻してやる必要があります。

2行目と3行目の間にf.seek(0)を挿入すると、出力結果が次のようになります。

aaa
bbb
ccc
ddd

ちなみに、'w'モードや'w+'モードでファイルを開いた際は、中身がすべて空白に上書きされるので、writeを使ってファイルに書き込む前に読み込むと、何も入っていない状態になりますので、憶えておきましょう。

‘r+’で読み込み・書き込み

書き込みのwの場合は、指定したファイルが存在しなければ、作成して書き込むことが可能ですが、読み込みのrが先にくると、指定したファイルが存在しない場合にファイルを読み込もうとするとエラーが返されます。

なので、r+を使う場合は、存在するファイルを指定する必要があります。(今回は先程作成している【text.txt】を使っています。)

with open('text.txt', 'r+') as f:
    print(f.read())
    f.seek(0)
    f.write('aaa\nbbb\nccc')

出力結果

aaa
bbb
ccc

【text.txt】をf.readで出力したあと、カーソルの位置を最初に戻して、同じ文字列を書き込んでいます。

4行目のf.write('aaa\nbbb\nccc')は最初の位置に差し込み挿入されるのではなく、上書きされるので、何度実行しても出力結果は同じです。

一方で、3行目のseek(0)を記述せずに、カーソルの位置を戻さないでコードを実行した場合は、実行するたびに、後ろに文字列が追加されていくことになります。

with open('text.txt', 'r+') as f:
    print(f.read())
    f.write('aaa\nbbb\nccc\nddd')

3回実行後の出力結果

aaa
bbb
ccc
dddaaa
bbb
ccc
dddaaa
bbb
ccc
ddd

最初の【text.txt】ファイルにはすでに文字列が記述されているので、1回目の実行でaからdまでが出力されますが、その後3行目で同じ文字列が書き込まれます。

つまり、3回実行したあとの【text.txt】の中身は、aからdまでの文字列が4回記述されていることになります。

変わったことをやってみる

Python学習は、酒井さんの講座を学習しながらすすめていますが、レクチャーをそのままやっているだけでは理解は深まりません。

すでに何度かお伝えしていますが、レクチャーで疑問に思ったことやエラーが起こりそうなこと、こうすればどうなるんだろうと思ったことは、どんどんチャレンジしてみることが大切です。

正しい答えばかりを求めていては、学習したことを記憶に残すことはできません。

興味を持ったことをやってみて失敗したり、ちょっと違った結果が得られたりすることで、学習内容が記憶として残っていきます。

なので、普通ならこんなことしないんじゃないかな?と思えることをやってみてください。

なにかに関連付いたほうが、圧倒的に記憶に残ります。

繰り返し実践してどんどん失敗して、しっかりと記憶に残していきましょう!

それでは、明日もGood Python!