はじめに

こんにちは!エンジニアリングソリューション事業部のABEです。
好きな色はモノトーンカラーと黄色です。
私は2020年に新卒未経験として入社し、現在はPythonやRobot Frameworkを使用して
ネットワーク機器の検証を自動化するプロジェクトに携わっています。

本記事では、私が実業務でも使用したPythonでファイル操作を自動化する方法を
テキストファイル編とExcelファイル編の2つに分けて紹介します。

Excelファイルに入力された値を読み込み、その値を使用してテキストファイルに自動で出力することで、効率よく作業を行うことができます。初級編として、一つずつのステップを丁寧に解説しましたので、最後まで読んでいただけると嬉しいです。

今回はテキストファイル編です!

目次

1. 実装環境
2. テキストファイルを開く
3. テキストファイルの読み込み
4. テキストファイルへの書き込み
5. 活用例
6. 最後に
7. 参考資料

1. 実装環境

・Python 3.8.7

2. テキストファイルを開く

テキストファイルの読み書きの前にまず、対象のファイルを開く必要があります。
テキストファイルを開くにはopen()メソッドを使用します。

以下のように、第1引数に対象のファイルへのパス(絶対パス / 相対パスどちらでも
可)、第2引数に実行時のモードを指定します。

file_path = "/hoge/hoge/sample.txt"

# ファイルを開く
f = open(file_path, mode="r")
print(type(f))  # <class '_io.TextIOWrapper'>

# ファイルを閉じる
f.close()

open()メソッド実行時のモードは主に以下があります。
上記例の場合、mode=”r”を第2引数に指定しているため、対象のテキストは読み込み
専用ファイルとして開かれます。
※デフォルトのモードは読み取り専用になっているため、mode=”r”は省略可能です。

 ・”r” → 読み込み専用
 ・”r+” → 既存ファイルの読み書き専用
 ・”w” → 書き込み専用
 ・”a” → 追記専用

また、open()メソッドで開いたファイルは最後にclose()メソッドを使用して閉じる
必要があります。
with文を使用するとclose()メソッドを使用しなくても最後に自動でファイルを
閉じてくれるので、こちらの使用がおススメです!

先ほどの例をwith文を使用して書き換えると以下のようになります。

file_path = "/hoge/hoge/sample.txt"

# with文を使用してファイルを開く
with open(file_path, mode="r") as f:
    print(type(f))  # <class '_io.TextIOWrapper'>

open()メソッドは開いたテキストファイルを_io.TextIOWrapper型として返すため、
このオブジェクトに対して後述する読み書き操作を実行していきます。

3. テキストファイルの読み込み

テキストファイルの読み込みで使用するメソッドは以下の3つです。

 ・read() → ファイルの中身を取得し文字列として返す
 ・readline() → ファイルの中身を取得し1行のみ文字列として返す
 ・readlines() → ファイルの中身を取得し行ごとにリストに格納して返す

以下の内容が記載されているsample.txtを読み込む前提で、各メソッドの返り値を
見ていきましょう。

AAAA
BBBB
CCCC
DDDD

まず始めにread()メソッドです。
read()メソッドを使用すると以下のようにテキストファイルの中身全体が文字列で
返却されます。

file_path = "/hoge/hoge/sample.txt"
with open(file_path) as f:
    print(f.read())
    # AAAA
    # BBBB
    # CCCC
    # DDDD

次にreadline()メソッドです。
readline()メソッドを使用するとテキストファイルの1行+空文字列が返却されます。

file_path = "/hoge/hoge/sample.txt"
with open(file_path) as f:
    print(f.readline())
    # AAAA
    # 

最後にreadlines()メソッドです。
readlines()メソッドを使用すると全ての行がリストに格納されます。
この時、改行コードの\nも含まれてしまうため、不要の場合はstrip()メソッドを
使用することで改行コードを削除してリストに格納することができます。

strip()メソッドの詳しい使い方は以下を参照
 https://www.sejuku.net/blog/50412

file_path = "/hoge/hoge/sample.txt"
with open(file_path) as f:
    line_list = f.readlines()
    print(line_list)
    # ['AAAA\n', 'BBBB\n', 'CCCC\n', 'DDDD']

    strip_line = [line.strip() for line in line_list]
    print(strip_line)
    # ['AAAA', 'BBBB', 'CCCC', 'DDDD']

4. テキストファイルへの書き込み

テキストファイルへの書き込みで使用するメソッドは以下の2つです。

 ・write() → 指定した文字列をファイルに書き込む
 ・writelines() → リストを使用してファイルに指定した文字列を書き込む

それでは各メソッドの動作を見ていきましょう。

まず始めにwrite()メソッドです。
open()メソッドの実行時にmode=”w”を指定した場合、指定したファイルに文字列が
上書き保存されます。
また、指定したファイルが存在しない場合は新規ファイルが作成されます。

以下の例では、ファイルの読み込みで使用したsample.txtに対して書き込みを行って
おり、中身は「EEEE」で上書きされます。

file_path = "/hoge/hoge/sample.txt"
sentence = "EEEE"
with open(file_path, mode="w") as f:
    f.write(sentence)

# write()メソッド実行後のファイルの中身
with open(file_path) as f:
    print(f.read())
    # EEEE

一方で、open()メソッドの実行時にmode=”a”を指定した場合は、
指定した既存ファイルの末尾に文字列が追記されます。
また、指定したファイルが存在しない場合は先ほどと同様に新規ファイルが
作成されます。

以下の例を実行するとsample.txtの末尾に「EEEE」が追記されます。

file_path = "/hoge/hoge/sample.txt"
sentence = "EEEE"
with open(file_path, mode="a") as f:
    f.write(sentence)

# write()メソッド実行後のファイルの中身
with open(file_path) as f:
    print(f.read())
    # AAAA
    # BBBB
    # CCCC
   # DDDDEEEE

「DDDD」と「EEEE」の間で改行したい場合はsentensce = “\nEEEE”と指定する
ことで改行されます。

file_path = "/hoge/hoge/sample.txt"
sentence = "\nEEEE"
with open(file_path, mode="a") as f:
    f.write(sentence)

# write()メソッド実行後のファイルの中身
with open(file_path) as f:
    print(f.read())
    # AAAA
    # BBBB
    # CCCC
    # DDDD
    # EEEE

次にwritelines()メソッドです。
mode=”w”mode=”a”での動作の違いは先ほどと同様のため説明は省略します。

writelines()メソッドを使用すると指定したリスト内の要素が結合され、
一つの文字列としてファイルへ書き込まれます。
以下の例を実行した場合、sample.txtは「EEEEFFFF」で上書きされます。

file_path = "/hoge/hoge/sample.txt"
sentence_list = ["EEEE", "FFFF"]
with open(file_path, mode="w") as f:
    f.writelines(sentence_list)

# writelines()メソッド実行後のファイルの中身
with open(file_path) as f:
    print(f.read())
    # EEEEFFFF

また、write()メソッドと同様に、sentence_list = [“EEEE”, “\nFFFF”]と指定する
ことで改行も可能です。

file_path = "/hoge/hoge/sample.txt"
sentence_list = ["EEEE", "\nFFFF"]
with open(file_path, mode="w") as f:
    f.writelines(sentence_list)

# writelines()メソッド実行後のファイルの中身
with open(file_path) as f:
    print(f.read())
    # EEEE
    # FFFF

ただ、ここで注意が必要なのはwrite()メソッド、writelines()メソッド共に
文字列以外の要素の書き込みはできない、という点です。
例えば、write()メソッドの引数にint型を指定した場合はTypeErrorが発生します。
そのため、数字を入力する際は以下のようにstr()メソッドを使用してstr型に
変換してから引数に指定するようにしましょう。

file_path = "/hoge/hoge/sample.txt"
num = 1
with open(file_path, mode="w") as f:
    f.write(str(num))

5. 活用例

では、これまでに紹介したテキストファイルの読み書き処理を実際に活用して
みましょう!

例えば、文字列を置換するreplace()メソッドと読み書き処理を組み合わせることで
テキストファイル内の特定の文字を書き換えて保存することができます。
以下の例では、テキストファイル内の「CCCC」の文字列を「EEEE」に書き換えて
上書き保存しています。

file_path = "/hoge/hoge/sample.txt"

# テキストファイルの読み込み
with open(file_path, mode="r") as f:
    sentence = f.read()
    # print(sentence)
    # AAAA
    # BBBB
    # CCCC
    # DDDD

# 文字列の置換
result = sentence.replace("CCCC", "EEEE")
print(result)
# AAAA
# BBBB
# EEEE
# DDDD

# テキストファイルへ書き込み
with open(file_path, mode="w") as f:
    f.write(result)

また、正規表現を使用すれば特定の条件に一致する文字列を書き換えることも可能です。
以下の例では、sub()メソッドを使用して先ほど書き換えたsample.txtの
「E」で始まる文字列、つまり「EEEE」を「CCCC」に書き換えています。

この時、reモジュールのインポートを忘れないようにしましょう。
※正規表現の詳細については以下を参照
 https://www-creators.com/archives/4278

import re

file_path = "/hoge/hoge/sample.txt"

# テキストファイルの読み込み
with open(file_path, mode="r") as f:
    sentence = f.read()
    # print(sentence)
    # AAAA
    # BBBB
    # EEEE
    # DDDD

# 文字列の置換
result = re.sub(r"E+", "CCCC", sentence)
print(result)
# AAAA
# BBBB
# CCCC
# DDDD

# テキストファイルへ書き込み
with open(file_path, mode="w") as f:
    f.write(result)

このように、置換処理と組み合わせることで指定した文字列のみ書き換えてファイルを
保存する処理を自動化することができます!

6. 最後に

以上がPythonを使用してテキストファイルの操作を自動化する方法です。
ここで紹介したのは非常にシンプルな例ですが、他にも組み合わせ方次第で様々な処理を
自動化することができるので、是非参考にしてみてください。

最後までお読みいただきありがとうございました!
次回はExcelファイルの操作を自動化する方法を紹介するのでお楽しみに!

7. 参考資料