【Python】テキストファイルへの追記(モードa, at)【入門第58回】
目次
- テキストファイルへの追記
- サンプルとするファイル
- テキストファイルを追記モードで開く
- 開いたファイルオブジェクトの型
- 追記モードで開いたファイルオブジェクトのオフセットの位置
write
メソッドで文字列を追記するwritelines
メソッドで文字列を追記する- おわりに
- 関連動画
テキストファイルへの追記
こんにちは、narupoです。
今回も前回に引き続き、Pythonのファイル入出力についてです。
今回はテキストファイルに文字列を追記する方法を解説します。
テキストファイルに文字列を追記するには、まずopen
関数にモードa
またはat
を指定してファイルを開きます。
あとはこのファイルオブジェクトのメソッドから文字列を追記します。
具体的には↓を見ていきます。
サンプルとするファイル
テキストファイルを追記モードで開く
開いたファイルオブジェクトの型
追記モードで開いたファイルオブジェクトのオフセットの位置
writeメソッドで文字列を追記する
writelinesメソッドで文字列を追記する
ほかのファイル入出力についての入門記事は↓をご覧ください。
- 【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回】
サンプルとするファイル
今回は解説のためにanimals.txt
というファイルを使います。
animals.txt
の中身は↓のようになっています。
:::text
ネコ
イヌ
サル
テキストファイルを追記モードで開く
テキストファイルに文字列を追記するにはまず、open
関数でテキストファイルを追記モードで開く必要があります。
:::python
with open('animals.txt', mode='a', encoding='utf-8') as fout:
pass
open
関数の第1引数には開きたいファイルのパスを指定します。
mode
引数には「テキストファイルへの追記」を表す文字列a
またはat
を指定します。
at
のt
は省略することが出来ます。
encoding
にはファイルのエンコーディングを指定します。
Windows環境ではopen
関数はデフォルトでcp932
エンコーディングでファイルを開こうとします。ファイルがutf-8
で保存されている場合はencoding
にutf-8
を指定するようにしてください。
open
関数の具体的な使い方については↓の記事をご覧ください。
追記モードはファイルが存在しなかった場合は、ファイルを新規作成してファイルを開きます。
既にファイルが存在していた場合はそのままファイルを開いてオフセット位置をファイル末尾に移動します。
開いたファイルオブジェクトの型
追記モードで開いたファイルオブジェクトのタイプは_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 ドキュメント
追記モードで開いたファイルオブジェクトのオフセットの位置
ファイルオブジェクトは内部にファイルのオフセット位置を持っています。
このオフセット位置は、ファイルオブジェクトがファイルを処理するときの基点になる位置です。
ファイルオブジェクトはファイルを読み書きするときにこのオフセット位置を基点にして読み書きします。
追記モードの正体ですが、これは開いたファイルのオフセット位置をファイル末尾に移動しているのですね。
このオフセット位置はマニュアルで変更することも出来ます。
その方法については↓の記事をご覧ください。
え? 開いたファイルのオフセット位置を目で見て確認したいですって?
あなたは素敵な人ですね。
そんな人のためにtell
メソッドを紹介します。
tell
メソッドはファイルのオフセット位置を返すメソッドです。
↓のようにして使います。
:::python
with open('animals.txt', mode='a', encoding='utf-8') as fout:
print('オフセット:', fout.tell())
animals.txt
は先ほど紹介したファイルですね。
↑のコードの実行結果は↓のようになります。
:::text
オフセット: 21
追記モードでオフセット位置がファイル末尾に移動しているのがわかります。
ちなみにモードw
でファイルを開いた場合は↓のような結果になります。
:::text
オフセット: 0
オフセット位置が0
になっていますね。これはファイル先頭と言う意味です。
ちなみにテキストファイルの場合、tell
メソッドの返す値は不明瞭な値です。
文字数とかバイト数とかそんなものは表していない使えない値です。
プログラムで利用する際は気を付けてください。
write
メソッドで文字列を追記する
追記モードで開いたテキストファイルに文字列を追記したい場合はwrite
メソッドを使います。
:::python
with open('animals.txt', mode='a', encoding='utf-8') as fout:
fout.write('マンモス\n')
↑のコードを実行したあとのanimals.txt
の中身は↓のようになります。
:::text
ネコ
イヌ
サル
マンモス
ファイルの末尾にマンモス\n
という文字列が追記されているのがわかります。
このwrite
メソッドはprint
のように自動で改行を付加しません。
ですので改行を付加したい場合は制御文字の\n
を文字列の末尾などに書きます。
writelines
メソッドで文字列を追記する
文字列のリストを追記したい場合はwritelines
メソッドを使います。
:::python
lines = [
'ラモス\n',
'ゴジラ\n',
'キングギドラ\n',
]
with open('animals.txt', mode='a', encoding='utf-8') as fout:
fout.writelines(lines)
↑のコードの実行結果は↓のようになります。
:::text
ネコ
イヌ
サル
マンモス
ラモス
ゴジラ
キングギドラ
writelines
メソッドも文字列の末尾に自動的に改行を付加しません。
そのため改行を加えたい場合はリストの文字列の末尾などに制御文字\n
を付加します。
おわりに
テキストファイルに文字列を追記できるようになると、データをファイルに追加することが出来るようになります。
モードw
やwt
はテキストファイルを空にしてファイルを開きますが、モードa
やat
はファイルを空にせずファイルにデータを追加していくことできます。
これを利用すればファイルに半永久的なログを取ったりすることが出来ますね。
以上、次回に続きます。
また見てね