【Python】テキストファイルへの追記(モードa, at)【入門第58回】

180, 2019-09-18

目次

テキストファイルへの追記

こんにちは、narupoです。

今回も前回に引き続き、Pythonのファイル入出力についてです。
今回はテキストファイルに文字列を追記する方法を解説します。
テキストファイルに文字列を追記するには、まずopen関数にモードaまたはatを指定してファイルを開きます。
あとはこのファイルオブジェクトのメソッドから文字列を追記します。

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

  • サンプルとするファイル

  • テキストファイルを追記モードで開く

  • 開いたファイルオブジェクトの型

  • 追記モードで開いたファイルオブジェクトのオフセットの位置

  • writeメソッドで文字列を追記する

  • writelinesメソッドで文字列を追記する

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

サンプルとするファイル

今回は解説のためにanimals.txtというファイルを使います。
animals.txtの中身は↓のようになっています。

ネコ
イヌ
サル

テキストファイルを追記モードで開く

テキストファイルに文字列を追記するにはまず、open関数でテキストファイルを追記モードで開く必要があります。

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

open関数の第1引数には開きたいファイルのパスを指定します。

mode引数には「テキストファイルへの追記」を表す文字列aまたはatを指定します。
attは省略することが出来ます。

encodingにはファイルのエンコーディングを指定します。
Windows環境ではopen関数はデフォルトでcp932エンコーディングでファイルを開こうとします。ファイルがutf-8で保存されている場合はencodingutf-8を指定するようにしてください。

open関数の具体的な使い方については↓の記事をご覧ください。

追記モードはファイルが存在しなかった場合は、ファイルを新規作成してファイルを開きます。
既にファイルが存在していた場合はそのままファイルを開いてオフセット位置をファイル末尾に移動します。

開いたファイルオブジェクトの型

追記モードで開いたファイルオブジェクトのタイプは_io.TextIOWrapperです。

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

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

<class '_io.TextIOWrapper'>

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

追記モードで開いたファイルオブジェクトのオフセットの位置

ファイルオブジェクトは内部にファイルのオフセット位置を持っています。
このオフセット位置は、ファイルオブジェクトがファイルを処理するときの基点になる位置です。
ファイルオブジェクトはファイルを読み書きするときにこのオフセット位置を基点にして読み書きします。

追記モードの正体ですが、これは開いたファイルのオフセット位置をファイル末尾に移動しているのですね。
このオフセット位置はマニュアルで変更することも出来ます。
その方法については↓の記事をご覧ください。

え? 開いたファイルのオフセット位置を目で見て確認したいですって?
あなたは素敵な人ですね。
そんな人のためにtellメソッドを紹介します。
tellメソッドはファイルのオフセット位置を返すメソッドです。
↓のようにして使います。

with open('animals.txt', mode='a', encoding='utf-8') as fout:
    print('オフセット:', fout.tell())

animals.txtは先ほど紹介したファイルですね。
↑のコードの実行結果は↓のようになります。

オフセット: 21

追記モードでオフセット位置がファイル末尾に移動しているのがわかります。
ちなみにモードwでファイルを開いた場合は↓のような結果になります。

オフセット: 0

オフセット位置が0になっていますね。これはファイル先頭と言う意味です。
ちなみにテキストファイルの場合、tellメソッドの返す値は不明瞭な値です。
文字数とかバイト数とかそんなものは表していない使えない値です。
プログラムで利用する際は気を付けてください。

writeメソッドで文字列を追記する

追記モードで開いたテキストファイルに文字列を追記したい場合はwriteメソッドを使います。

with open('animals.txt', mode='a', encoding='utf-8') as fout:
    fout.write('マンモス\n')

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

ネコ
イヌ
サル
マンモス

ファイルの末尾にマンモス\nという文字列が追記されているのがわかります。

このwriteメソッドはprintのように自動で改行を付加しません。
ですので改行を付加したい場合は制御文字の\nを文字列の末尾などに書きます。

writelinesメソッドで文字列を追記する

文字列のリストを追記したい場合はwritelinesメソッドを使います。

lines = [
    'ラモス\n',
    'ゴジラ\n',
    'キングギドラ\n',
]

with open('animals.txt', mode='a', encoding='utf-8') as fout:
    fout.writelines(lines)

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

ネコ
イヌ
サル
マンモス
ラモス
ゴジラ
キングギドラ

writelinesメソッドも文字列の末尾に自動的に改行を付加しません。
そのため改行を加えたい場合はリストの文字列の末尾などに制御文字\nを付加します。

おわりに

テキストファイルに文字列を追記できるようになると、データをファイルに追加することが出来るようになります。
モードwwtはテキストファイルを空にしてファイルを開きますが、モードaatはファイルを空にせずファイルにデータを追加していくことできます。
これを利用すればファイルに半永久的なログを取ったりすることが出来ますね。

以上、次回に続きます。

また見てね

関連動画





スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク