Pythonでファイルの先頭に文字列を追加するには、一度ファイルの内容を読み込んでからプログラム内で文字列を結合し、そのうえでファイルに書き出さなくてはいけません。
今回のお題は、
1行目
2行目
3行目
というテキストファイルの先頭に「0行目」という文字列を追加して、
0行目
1行目
2行目
3行目
といった内容にするところをゴールにします。
まず基本的な方法を紹介し、次に、たった1行でズバッとやっちゃう方法を紹介します🤓
open()関数を使う方法
最も基本的な方法は、open()関数でファイルを開いて読み込んだり書き出したりする方法です。読み込みモードでファイルをオープンして内容を読み込み、先頭に追加したい文字列と結合したうえで、今度は書き込みモードでファイルをオープンして書き込みます。
with open('file.txt') as reader:
s = reader.read()
s = '0行目\n' + s
with open('file.txt', 'w') as writer:
writer.write(s)
文字列で結合せず、先頭に追加したい文字列に対して個別にwrite()関数を呼び出しても同じ結果になります。
文字列を結合する操作を減らすことが出来るという利点はあるものの、書き出し途中でエラーが発生したりしてプログラムが終了してしまうと、書き出しが中途半端になって情報が失われる可能性があるので注意です。
with open('file.txt') as reader:
s = reader.read()
with open('file.txt', 'w') as writer:
writer.write('0行目\n')
# ここで例外が発生したりしてプログラムが終了してしまうと、ファイルの内容が失われる。
writer.write(s)
pathlibモジュールを使う方法
pathlibモジュールのPathクラスを使うと、read_text()メソッドやwrite_text()メソッドでファイルの内容をいっきに読み込み・書き出しができるので、open()関数を使ってファイルを開くようなプログラムを書かなくて済みます。
from pathlib import Path
file_path = Path('file.txt')
s = file_path.read_text()
s = '0行目' + s
file_path.write_text(s)
with構文も使わなくていいぶん、プログラムの可読性も少し上がりました。
textfileパッケージを使う方法
さいごに、textfileパッケージを使う方法を紹介します。textfileパッケージを使うと、さらにプログラムを簡潔に記述することができます。本音をいうと、これを紹介したくてこの記事を書いたといっても過言ではありません。(笑)
textfileパッケージは、Pythonのプログラムで繰り返し書かれているようなテキストファイルの操作を、さらに簡略化して書くことを目的に作成されたパッケージです。
インストール
textfileモジュールは標準モジュールに含まれていないので、あらかじめpipを使ってパッケージをインストールしておく必要があります。
pip install textfile
プログラム
textfileモジュールを使ってファイルの先頭に文字列を追加するプログラムはこんな感じになります。
import textfile
textfile.insert('file.txt', '0行目\n', line=0)
先頭以外にもinsertできる
今回はファイルの先頭に文字列を追加するというお題でしたが、textfile.insert()関数は、line引数を変更することで、ファイルの先頭以外にも文字列を追加することができて便利なので、少し紹介しておきます。
1行目の直後に文字列を追加する
textfile.insert('file.txt', '1.5行目\n', line=1)
# 結果:
# 1行目
# 1.5行目
# 2行目
# 3行目
後ろから2行目に文字列を追加する
textfile.insert('file.txt', '-2行目\n', line=-2)
# 結果:
# 1行目
# 2行目
# -2行目
# 3行目
あとがき
今回は、ファイルの先頭に文字列を追加する方法を3つ、紹介しました。
プログラムは短いほど、読みやすいほどバグが入り込むリスクを減らすことができるので、常に「もっと簡潔にプログラムを書くことができないだろうか?」と考えるクセをつけましょう。