Pythonでテキストファイルを読み書きするには、まず組み込み関数のopen()でファイルを開いてから、read()write()のメソッドを用いて操作します。

では、既存のテキストファイルの中身を編集して書き換えるにはどうしたらよいでしょうか。例えば、以下のようにファイルの中身の「グーブルマップ」を「Google マップ 」に置換する場合です。

置換「前」のサンプルファイル(sample.txt)
グーグルマップは単に地図を見るだけでなく、便利な機能を備えています。
例えば、行きたい場所があったら、とりあえずグーグルマップに保存しておけば、後で確認できます。また、グーグルマップは現在地をリアルタイムに送信できるので、誰かと待ち合わせした時に居場所を知らせることもできます。
置換「後」のサンプルファイル(sample.txt)
Google マップ は単に地図を見るだけでなく、便利な機能を備えています。
例えば、行きたい場所があったら、とりあえずGoogle マップ に保存しておけば、後で確認できます。また、Google マップ は現在地をリアルタイムに送信できるので、誰かと待ち合わせした時に居場所を知らせることもできます。

※ 「Google マップ 」の「マップ」の前後には半角スペースが入ります。

今回は、このようなテキストファイルの中身を置換して書き換える方法をご紹介します。

本記事の目次

テキストファイルの書き換え方法

既存のテキストファイルを書き換えるには、以下の手順でプログラミングします。

  1. 既存ファイルの中身を読み込み、文字列として変数に代入する。
  2. 読み込んだ中身の文字列を置換(編集)する。
  3. 置換した中身を同じファイル名で書き込み保存する。

以下のように同じファイル名file_name)で書き込み保存するのがポイントです。

file_name = "sample.txt"

with open(file_name, encoding="cp932") as f:
    data_lines = f.read()

# 文字列置換
data_lines = data_lines.replace("グーグルマップ", "Google マップ ")

# 同じファイル名で保存
with open(file_name, mode="w", encoding="cp932") as f:
    f.write(data_lines)

なお、ここではテキストファイルのエンコードはShift_JISで読み書きするので、encoding=cp932を指定しています。

元のファイルをバックアップとして残す方法

元ファイルは上書きしてしまうので、後で必要になる場合はバックアップを保存しておきます。バックアップは、拡張子.bakを付加したファイルにコピーして作成します。

以下のように、shutil.copy()を用いて、最初にバックアップファイルを作成します。ここでは、ファイルはsample.txt.bakという名前で作成されます。

import shutil

file_name = "sample.txt"
# バックアップファイルの保存
back_name = file_name + ".bak"
shutil.copy(file_name, back_name)

with open(file_name, encoding="cp932") as f:
    data_lines = f.read()

# 文字列置換
data_lines = data_lines.replace("グーグルマップ", "Google マップ ")

# 同じファイル名で保存
with open(file_name, mode="w", encoding="cp932") as f:
    f.write(data_lines)

その他の方法(fileinputモジュール)

標準モジュールのfileinputモジュールを用いるとかなり少ないコードで書くことができます。fileinputモジュールは元々は複数ファイルの処理を簡単に書くためにありますが、インプレース(in-place)フィルタ機能を用いると単一ファイルの書き換えが可能になります。

fileinputモジュール(https://docs.python.org/ja/3/library/fileinput.html)

以下のようにインプレース(in-place)フィルタ機能をオプションで有効(inplace=True)にすると、標準出力が入力ファイルに設定されるので、置換した文字列をprint()で標準出力するだけでファイルをその場で書き換えできます。

import fileinput

file_name = "sample.txt"

with fileinput.FileInput(file_name, inplace=True, backup=".bak") as f:
    for line in f:
        print(line.replace("グーグルマップ", "Google マップ "), end="")

この方法は簡単に書けて、バックアップファイルも保存されるので便利ですが、エンコードを指定できません。Shift_JISのファイルをWindows上で書き換えるなら問題ありませんが、OSデフォルトのエンコードのファイルしか対応できないので、使用時には留意する必要があります。

参考ページ

以下のstackoverflowのページでも様々は方法が議論されていますので、参考になります。

How to search and replace text in a file?