【Python】ファイルを読み込む – リスト形式の汎用ファイル編

python-logo Python

Pythonで通常のファイルを読み込む方法。

jsonやcsvのファイルは、今回解説するものよりも
よりスマートな方法が存在するので、そちらを参考にした方が良い。

今回扱うデータは.txtのような汎用的なファイルだ。

Pythonでファイルを読み込む方法

ファイルを読み込む手順は

  1. ファイルを開く
  2. ファイルを読み取る
  3. ファイルを閉じる

という手順が一般的だ。

Pythonでも、open()close()などが用意されているが、
実際はあまり使われることがない。

close()忘れなどの可能性があるからだ。

Pythonでファイル操作を行う場合、
with構文を活用することでスマートに操作できる。

今回読み込むデータ

今回読み込むデータは、以下のような
縦に並べられたリストデータである。

これは言い換えると改行区切りのデータとも言える。

fruits.txt

apple
banana
orange

最終的にはこのデータをリストに格納したい。

ファイルを読み込む時のwith構文

with open('ファイル名', 'r') as file:
    # 読み込んだ時の処理

with構文はこれだけである。

読み込み専用(r)でファイルを開き、fileという変数で扱う。

3パターン紹介する

今回はreadlines()というメソッドを使って読み込む方法を3パターン紹介する。

  1. 改行を気にせずに読み込む
  2. 改行を削除しながら読み込む
  3. 改行を削除しながら読み込むが、よりスマートに記述する

readlines()は、ファイル内のデータを一括読み込みするメソッドである。

改行を気にせずに読み込む

# パターン1: 改行コードを気にせずファイルを読み込む
with open('fruits.txt', 'r') as file:

    # ファイル全体をリストとして読み込み、dataという変数に格納する
    data = file.readlines()

    # 読み込んだデータを出力
    print('パターン1: ' + str(data))



# 出力結果
# 改行コードが含まれたままリストに格納される
パターン1: ['apple\n', 'banana\n', 'orange\n']

改行を削除しながら読み込む

strip()を利用すると、先頭や末尾に存在する
スペース、改行、タブなどを削除してくれる。

# パターン2: 改行コードを削除して読み込む
with open('fruits.txt', 'r') as file:

    # 最終的にデータを追加する変数
    data = []

    # for文で改行コードを削除しながらデータを追加していく
    for s in file.readlines():

        # strip()を使ってスペースや改行、タブを削除しながらリスト追加する
        data.append(s.strip())

    # 読み込んだデータを出力
    print('パターン2: ' + str(data))


# 出力結果
# 改行コードが削除された状態でリストに格納される
パターン2: ['apple', 'banana', 'orange']

改行を削除しながら読み込むが、よりスマートに記述する

やっている内容は上記と一緒であるが、
この程度のfor文の場合はリスト内包表記を利用すると、
よりスマートに記述することができる。

# パターン3: リスト内包表記を使って簡潔に改行コードを削除する
with open('fruits.txt', 'r') as file:

    # リスト内包表記を使ってリスト内のそれぞれの要素に対して改行削除の処理を行ってリストに格納する
    data = [s.strip() for s in file.readlines()]

    # 読み込んだデータを出力
    print('パターン3: ' + str(data))


# 出力結果
# 改行コードが削除された状態でリストに格納される
パターン3: ['apple', 'banana', 'orange']

まとめ

  • 通常はwith構文でファイルを読み込む
  • 改行コード削除はstrip()を使う
  • リストの読み込みは、リスト内包表記で簡潔に記述できる
  • jsonとcsvは他の方法を使って読み込む方がスマート
  • ファイル読み込みの他のメソッドにはread()readline()がある
タイトルとURLをコピーしました