【Python】テキストファイルを読み書きモードで新規作成して開く(モードw+, w+t)【入門第65回】

194, 2019-09-24

目次

テキストファイルを新規作成して読み書きする

こんにちは、narupoです。

今回も前回に引き続き、Pythonのファイル入出力についてです。
今回はテキストファイルを読み書きモードで新規作成して開く方法を解説します。

テキストファイルを読み書きモードで新規作成して開くには、open関数のmode引数に文字列w+またはw+tを指定します。
w+またはw+tモードのopen関数から得られるファイルオブジェクトは_io.TextIOWrapperです。
このファイルオブジェクトのメソッドを使うとテキストファイルに文字列を書き込むことが出来ます。

今回は具体的には↓を見ていきます。

  • テキストファイルを読み書きモードで新規作成して開く

  • ファイルオブジェクトのタイプ

  • 文字列を読み込む

  • 文字列を書き込む

ほかのファイル入出力についての入門記事は↓をご覧ください。

テキストファイルを読み書きモードで新規作成して開く

テキストファイルを読み書きモードで、かつ新規作成して開くにはopen関数を↓のようにして使います。

with open('animals.txt', mode='w+', encoding='utf-8') as fp:
    pass

open関数の第1引数に開きたいテキストファイルのパスを指定します。
mode引数に文字列w+またはw+tを指定します。
encodingには開くテキストファイルのエンコーディングを指定します。

w+またはw+tモードは、ファイルが存在しない場合はファイルを新規作成してファイルを開きます
そして、ファイルが既に存在する場合は、そのファイルの内容を空にしてからファイルを開きます
特徴としてはwまたはwtと同じ特徴を持っているので、大切なデータが入っているファイルを誤って空にしないように注意してください。

その他、open関数の詳しい使い方については↓の記事をご覧ください。

ファイルオブジェクトのタイプ

w+またはw+tモードで開いたテキストファイルのファイルオブジェクトのタイプは_io.TextIOWrapperです。

with open('animals.txt', mode='w+', encoding='utf-8') as fp:
    print(type(fp))

↑のコードの実行結果は↓のようになります。

<class '_io.TextIOWrapper'>

このTextIOWrapperTextIOBaseを継承したクラスです。
さらにTextIOBaseIOBaseを継承しています。
TextIOBaseIOBaseの公式ドキュメントを見ればこのファイルオブジェクトで使えるメソッドを一望できます。

文字列を書き込む

ファイルオブジェクトのメソッドを使うとファイルを読み書き出来ます。
ファイルに文字列を書き込むにはwriteメソッドなどを使います。

with open('animals.txt', mode='w+', encoding='utf-8') as fp:
    fp.write('猫\n')

↑のコードを実行すると↓のような内容のanimals.txtが作成されます。

その他の書き込み用のメソッドについては↓の記事をご覧ください。

文字列を読み込む

ファイルから文字列を読み込むにはreadメソッドなどを使います。

with open('animals.txt', mode='w+', encoding='utf-8') as fp:
    content = fp.read()
    print(content)

↑のコードを実行した場合、contentの中身は空の文字列です。
ファイルの中身が空だからですね。
↓のように書きこんでからreadしてみるとどうでしょうか。

with open('animals.txt', mode='w+', encoding='utf-8') as fp:
    # 1行書き込む
    fp.write('猫\n')

    # 1行読み込む?
    content = fp.read()
    print(content)

↑これもcontentの中身は空になります。
これの原因は、ファイルのオフセット位置です。
writeメソッドは書き込むときにファイルのオフセット位置を書き込んだ分進めます。
そのため、↑のコードではwriteメソッドを呼び出した直後のファイルのオフセット位置はファイル終端(EOF)になっています。
ファイル終端からreadをした場合、読み込む文字列が無いのでreadの返す値は空の文字列になります。

↓のようにwriteのあとにファイルのオフセット位置をファイル先頭に戻すと、readで1行読み込めます。

import os

with open('animals.txt', mode='w+', encoding='utf-8') as fp:
    # 1行書き込む
    fp.write('猫\n')

    # オフセット位置をファイル先頭に戻す
    fp.seek(0, os.SEEK_SET)

    # 1行読み込む
    content = fp.read()
    print(content)

↑のコードの実行結果は↓のようになります。

↓のようにファイルのオフセット位置を操作するにはseekメソッドを使います。

    fp.seek(0, os.SEEK_SET)

seekメソッドの第1引数には第2引数からの相対位置を、第2引数には基点位置を指定します。
os.SEEK_SETはファイル先頭を表す定数です。
つまり、ファイル先頭(SEEK_SET)から0の位置にシークする……オフセット位置を移動するということですね。

このように、w+またはw+tモードでテキストファイルを開いて読み込む場合、オフセット位置をシークする必要が出てきます。
この辺はw+またはw+tモードの特徴と言えます。

その他、読み込み用のメソッドについては↓の記事をご覧ください。

おわりに

w+r+の大きな違いは、w+はファイルを空にして開き、r+はファイルが存在しない場合はエラーを出す点です。
良い感じで両者を使い分けるようにすると良さそうですね。
また、今回もランダムアクセスについてちょろっとやりました。

以上、次回に続きます。

また見てね

関連動画





スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク