【Python】テキストファイルを読み書きモードで追記する(モードa+, a+t)【入門第70回】
目次
- テキストファイルを読み書きモードで追記する
- テキストファイルを読み書き&追記モードで開く
io.TextIOWrapper
の詳細- テキストファイルに文字列を追記する
- テキストファイルから文字列を読み込む
- おわりに
- 関連動画
テキストファイルを読み書きモードで追記する
テキストファイルを読み書きモードで追記するにはopen
関数のmode
引数に文字列a+
またはa+t
を指定します。
このモードのopen
関数から得られるファイルオブジェクトはio.TextIOWrapper
です。
ファイルオブジェクトのread
やwrite
メソッドを使うとテキストファイルを読み書きすることが出来ます。
今回は具体的には↓を見ていきます。
テキストファイルを読み書き&追記モードで開く
io.TextIOWrapperの詳細
テキストファイルに文字列を追記する
テキストファイルから文字列を読み込む
ほかのファイル入出力についての入門記事は↓をご覧ください。
- 【Python】ファイルを開いて閉じる。open関数の使い方【入門第54回】
- 【Python】テキストファイルの読み込み(モードr, rt)【入門第55回】
- 【Python】テキストファイルへの書き込み(モードw, wt)【入門第56回】
- 【Python】テキストファイルへの追記(モードa, at)【入門第57回】
- 【Python】テキストファイルを排他的に開いて書き込む(モードx, xt)【入門第58回】
- 【Python】バイナリファイルの読み込み(モードrb)【入門第59回】
- 【Python】バイナリファイルへの書き込み(モードwb)【入門第60回】
- 【Python】バイナリファイルへの追記(モードab)【入門第61回】
- 【Python】バイナリファイルを排他的に開いて書き込む(モードxb)【入門第62回】
- 【Python】テキストファイルを読み書きモードで開く(モードr+, r+t)【入門第63回】
- 【Python】テキストファイルを読み書きモードで新規作成して開く(モードw+, w+t)【入門第64回】
- 【Python】テキストファイルを読み書きモードで、新規作成して、排他的に開く(モードx+, x+t)【入門第65回】
- 【Python】バイナリファイルを読み書きモードで開く(モードr+b)【入門第66回】
- 【Python】バイナリファイルを読み書きモードで新規作成して開く(モードw+b)【入門第67回】
- 【Python】バイナリファイルを読み書きモードで排他的に開く(モードx+b)【入門第68回】
- 【Python】テキストファイルを読み書きモードで追記する(モードa+)【入門第69回】
- 【Python】バイナリファイルを読み書きモードで追記する(モードa+b)【入門第70回】
- 【Python】バイナリファイルのランダムアクセスの基本・前編【入門第71回】
- 【Python】バイナリファイルのランダムアクセスの基本・後編【入門第72回】
- 【Python】ランダムアクセスによる固定長レコードの読み書き・前編【入門第73回】
テキストファイルを読み書き&追記モードで開く
テキストファイルを読み書き&追記モードで開くにはopen
関数を↓のようにして使います。
:::python
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
です。
:::python
with open('animals.txt', mode='a+', encoding='utf-8') as fout:
print(type(fout))
↑のコードの実行結果は↓のようになります。
:::text
<class 'io.TextIOWrapper'>
このTextIOWrapper
はTextIOBase
を継承したクラスです。
さらにTextIOBase
はIOBase
を継承しています。
TextIOBase
とIOBase
の公式ドキュメントを見ればこのファイルオブジェクトで使えるメソッドを一望できます。
- io --- ストリームを扱うコアツール - TextIOBase — Python 3.7.4 ドキュメント
- io --- ストリームを扱うコアツール - IOBase — Python 3.7.4 ドキュメント
テキストファイルに文字列を追記する
今回は例として↓のような内容のテキストファイルanimals.txt
を例に解説します。
:::text
cat
dog
bird
a+
またはa+t
モードでテキストファイルに文字列を追記するには↓のようにwrite
メソッドなどを使います。
:::python
with open('animals.txt', mode='a+', encoding='utf-8') as fp:
fp.write('pig\n')
fp.write('elephant\n')
↑のコードを実行するとanimals.txt
の中身は↓のようになります。
:::text
cat
dog
bird
pig
elephant
その他、テキストファイルへの書き込みについて詳しく知りたい方は↓の記事をご覧ください。
- 【Python】テキストファイルへの書き込み(モードw, wt)【入門第56回】 - narupoのブログ
- 【Python】テキストファイルへの追記(モードa, at)【入門第57回】 - narupoのブログ
テキストファイルから文字列を読み込む
a+
またはa+t
モードで開いたテキストファイルから文字列を読み込むには↓のようにしたいところですが、
:::python
with open('animals.txt', mode='a+', encoding='utf-8') as fp:
content = fp.read()
print(content)
↑の実行結果は空の文字列になります。
a+
またはa+t
モードで開いたテキストファイルのオフセット位置はファイル末尾になっています。
そのため↑のようにして文字列を読み込もうとしても、読み込む基点がファイル末尾になっているためread
メソッドは空の文字列を返します。
このファイルのオフセット位置はtell
メソッドで確認することが出来ます。
たとえば↓のようにです。
:::python
with open('animals.txt', mode='a+', encoding='utf-8') as fp:
print(fp.tell())
↑のコードの実行結果は↓のようになります。
:::text
13
テキストファイルの場合、tell
メソッドは不明瞭な値を返します。
しかし、なんとな~くファイルの末尾らしい値であることがわかります。
そうか?
適当なこと言ってら
追記モードで開いたテキストファイルの内容を読み込みたい場合は、↓のようにファイルのオフセット位置をファイル先頭に移動してから読み込みます。
:::python
import os
with open('animals.txt', mode='a+', encoding='utf-8') as fp:
# ファイルのオフセット位置をファイル先頭に移動
fp.seek(0, os.SEEK_SET)
# ファイル先頭から文字列を読み込み
content = fp.read()
print(content)
↑のコードの実行結果は↓のようになります。
:::text
cat
dog
bird
seek
メソッドの第1引数には第2引数からの基点位置を指定します。
第2引数にはシークの基点となる定数を渡します。
os.SEEK_SET
はファイル先頭を表す定数です。
つまりfp.seek(0, os.SEEK_SET)
というのはファイルのオフセット位置を「ファイル先頭から0
の位置」に移動する命令というわけです。
その他、テキストファイルからの読み込みについて詳しく知りたい方は↓の記事をご覧ください。
おわりに
ファイルの追記モードはw
系に比べると安心できるモードです。
ファイルを破壊しないのでどんどん使えます。
ログなどのデータを追記したい&読み込みたい場合はこのa+
またはa+t
モードを使いましょう。
以上、次回に続きます。
また見てね