【Python】テキストファイル(.txt)をリストで読み込む/書き込む方法

本記事では以下の内容を解説しています.

  • テキストファイルをPythonで読み込みリスト化する
  • 余分なスペースや改行,重複を削除して読み込む
  • リスト型のデータをテキストファイルに追記する

テキストファイルをPythonで読み込みリスト化する

使用するテキストファイルはsample.txtです.
このファイルを読み込んでリスト化していきます.
(説明のために本来は不要な改行やスペース,重複を入れています)

sample.txtの内容

えび
かに
 うに
文鳥 

かに

文字列をリストで取得

with文とリスト内包表記を使用して以下のように書くと,リストで文字列を取得できます.


with open('./sample.txt', mode='r', encoding='utf-8') as f:
    txt = [word.strip() for word in f if word != '\n']
txt
['えび', 'かに', 'うに', '文鳥', 'かに']

解説

open()の第一引数でテキストファイルのパス1,第二引数で読み込み専用モード2, 第三引数でencodingを指定しています.

2行目:for文でテキストファイルの内容を順に取得します.
この際にif word != '\n'で改行だけの行を除くようにしています.

取り出したwordをリストに追加する際にstrip()メソッドで文字列の前後の余計な空白・改行コードを除去しています.

参考

strip()メソッドを使用しないと以下のような結果になります.
全角スペースコードの\u3000や改行コード\nが入り込んでいます.

['えび\n', 'かに\n', '\u3000うに\n', '文鳥\u3000\n', 'かに']

重複を削除したリストを取得

上記で取得したテキストは「かに」が重複しています.
重複を落としたい場合はset()を使用して以下のようにします.


with open('./sample.txt', encoding='utf-8') as f:
    txt = set([word.strip() for word in f if word != '\n'])
txt = list(txt)
txt
['えび', '文鳥', 'かに', 'うに']

注意

set型は順序が保証されないので,リストの順番は一定ではありません.
リストの順番を保持したい場合は次項を参照.

重複削除+順序を保持したリストを取得

sorted()メソッドでリストのindexをキーとして並び替えると順番が保持されます.


# 順序を保持したい場合
with open('./sample.txt', encoding='utf-8') as f:
    txt_key = [word.strip() for word in f if word != '\n']
txt = sorted(set(txt_key), key=txt_key.index)
txt
['えび', 'かに', 'うに', '文鳥']

リスト型のデータをテキストファイルに追記する

ここではすでにリスト型で存在するデータをsample.txtに追記する方法を見てみましょう.
変数add_listのデータが今回追加するデータです.


add_list = ['カラス', 'スズメ']
first_loop = True

# mode='a'は既存ファイルへの追記を指定
with open('./sample.txt', mode='a', encoding='utf-8') as f:
    for i in add_list:
        if first_loop:
            f.write('\n' + i + '\n')  # 1回目だけ改行を前に入れる
            first_loop = False
        else:
            f.write(i + '\n')  # 2回目以降

sample.txtの内容

えび
かに
 うに
文鳥 

かに
カラス
スズメ

解説

with文を使用しmode = 'a'としてファイルを開きます.
これによって既存ファイルへの追記ができます.

追加したいリストの文字列をfor文で取り出し,1回目のループ時だけ前後に改行を入れた状態でファイルへ書き込みます(f.write('\n' + i + '\n')部分) 2回目以降は文字列の後ろ側に改行を入れます.

上記の処理によって「かに」の下に「カラス,スズメ」が追加されます.

参考

単純に書き込むとテキストの一番後ろから追記されるので以下のような結果となります.

えび
かに
 うに
文鳥 

かにカラススズメ

ひとこと

テキストを様々な形で利用できると幅が広がりますね.
リストやsetはよく使うのでしっかりと押さえておきたいです.


  1. 今回はsample.txtのパスをカレントディレクトリからの相対パスで指定しています. 

  2. 'r'で読み込み専用モードを指定できます.なお,デフォルトもmode='r'なので,省略しても結果は同じです.