【Python】テキストファイルを読み書きモードで追記する(モードa+, a+t)【入門第70回】

204, 2019-09-30

目次

テキストファイルを読み書きモードで追記する

テキストファイルを読み書きモードで追記するにはopen関数のmode引数に文字列a+またはa+tを指定します。
このモードのopen関数から得られるファイルオブジェクトはio.TextIOWrapperです。
ファイルオブジェクトのreadwriteメソッドを使うとテキストファイルを読み書きすることが出来ます。

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

  • テキストファイルを読み書き&追記モードで開く

  • io.TextIOWrapperの詳細

  • テキストファイルに文字列を追記する

  • テキストファイルから文字列を読み込む

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

テキストファイルを読み書き&追記モードで開く

テキストファイルを読み書き&追記モードで開くにはopen関数を↓のようにして使います。

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

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

このモードのopen関数は開こうとするファイルが存在しない場合はファイルを新規作成してファイルを開きます。
ファイルがすでに存在する場合はファイルのオフセット位置を末尾に移動してファイルを開きます。

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

io.TextIOWrapperの詳細

書き込みモードで開いたテキストファイルのファイルオブジェクトのタイプはio.TextIOWrapperです。

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

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

<class 'io.TextIOWrapper'>

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

テキストファイルに文字列を追記する

今回は例として↓のような内容のテキストファイルanimals.txtを例に解説します。

cat
dog
bird

a+またはa+tモードでテキストファイルに文字列を追記するには↓のようにwriteメソッドなどを使います。

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

↑のコードを実行するとanimals.txtの中身は↓のようになります。

cat
dog
bird
pig
elephant

その他、テキストファイルへの書き込みについて詳しく知りたい方は↓の記事をご覧ください。

テキストファイルから文字列を読み込む

a+またはa+tモードで開いたテキストファイルから文字列を読み込むには↓のようにしたいところですが、

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

↑の実行結果は空の文字列になります。
a+またはa+tモードで開いたテキストファイルのオフセット位置はファイル末尾になっています。
そのため↑のようにして文字列を読み込もうとしても、読み込む基点がファイル末尾になっているためreadメソッドは空の文字列を返します。

このファイルのオフセット位置はtellメソッドで確認することが出来ます。
たとえば↓のようにです。

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

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

13

テキストファイルの場合、tellメソッドは不明瞭な値を返します。
しかし、なんとな~くファイルの末尾らしい値であることがわかります。

そうか?

適当なこと言ってら

追記モードで開いたテキストファイルの内容を読み込みたい場合は、↓のようにファイルのオフセット位置をファイル先頭に移動してから読み込みます。

import os

with open('animals.txt', mode='a+', encoding='utf-8') as fp:
    # ファイルのオフセット位置をファイル先頭に移動
    fp.seek(0, os.SEEK_SET)

    # ファイル先頭から文字列を読み込み
    content = fp.read()
    print(content)

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

cat
dog
bird

seekメソッドの第1引数には第2引数からの基点位置を指定します。
第2引数にはシークの基点となる定数を渡します。
os.SEEK_SETはファイル先頭を表す定数です。
つまりfp.seek(0, os.SEEK_SET)というのはファイルのオフセット位置を「ファイル先頭から0の位置」に移動する命令というわけです。

その他、テキストファイルからの読み込みについて詳しく知りたい方は↓の記事をご覧ください。

おわりに

ファイルの追記モードはw系に比べると安心できるモードです。
ファイルを破壊しないのでどんどん使えます。
ログなどのデータを追記したい&読み込みたい場合はこのa+またはa+tモードを使いましょう。

以上、次回に続きます。

また見てね

関連動画





スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク