Pythonでcsvファイルの特定の行だけ(行指定で)読み込む方法

Pythonでデータファイルの特定の行だけを読み込む方法

csvファイルを読み込む時に、特定の行だけを読み込みたいってことありますよね。
例えば、1行飛ばしで読み込んだり、特定の1行だけの情報を読み込みたいとか。
この記事では、Pythonを使ってcsvファイルの特定の行だけを行指定で読み込む方法を具体的に解説していきます。

動作環境
macOS Catalina(10.15.3), python3.7.6, Atomエディタ1.44.0

特定の行だけを読み込む方法について

特定の行だけを読み込むプログラムは、ファイルを1行ずつ読み込む方法がわかっていれば簡単に実装できます。
なぜなら、1行ずつ読み込む過程で、必要のない行は無視すればいいからです。

以下では、(1)1行飛ばしで読み込む方法、(2)特定の1行だけを読み込む方法の2つについてそれぞれご紹介します。

1行飛ばしで読み込む方法

1行飛ばしで読み込むプログラムは、if文で条件分岐してやることで簡単に実装できます。

ファイルの用意

次のようなcsvファイルを用意しました。
このcsvファイルをDesktop/LabCode/python/data-analysis/Input_File_Specrowに置きます。

# averaged temperature in 2018 @ Kyoto city
# 01: month  02: averaged temperature in the daytime
1,3.9
2,4.4
3,10.9
4,16.4
5,20.0
6,23.4
7,29.8
8,29.5
9,23.6
10,18.7
11,13.5
12,8.2

プログラムの実装(サンプルコード)

コードは次のようになります。

import re

input_data = open('AvrgTmp_Kyoto2018.csv', 'r')

num = 0
for row in input_data:
    if not re.match('#', row):
        if num % 2 == 0:
            split_row = row.rstrip('\n').split(',')
            month = split_row[0]
            ave_temperature = split_row[1]
            print(month, ave_temperature)
        num += 1

input_data.close()

出力結果

ターミナルでcd Desktop/LabCode/python/data-analysis/Input_File_Specrowとしてから、
プログラムを実行すると次のような結果が出力されます。

python input_file.py

# (実行結果)
# 1 3.9
# 3 10.9
# 5 20.0
# 7 29.8
# 9 23.6
# 11 13.5

コードの解説

num = 0
for row in input_data:
    num += 1

ファイルを読み込む前にnum = 0という初期値0のInt変数を定義します。
1行読み込むごとにnum += 1 (num = num +1 と同義)と書くことで、numに1を加算しています。
つまり、numが0の時はデータの1行目、numが1の時はデータの2行目、、、というnumと行に1対1の対応がつきます。

numと行の対応がついたら、あとは剰余(割ったあまりがいくらか)で条件分岐すれば1行飛ばしにデータを読み込むことが可能になっています。

if num % 2 == 0:

if num % 2 == 0と書くことで、numが偶数のときだけ後続の処理を行うようにできます。これを応用すると、if num % 3 == 0とすれば2行飛ばしでデータを読み込めます。
numの初期値を0ではなく1とかにすると、最初の行を読み飛ばせたりできるので、色々とアレンジができます。ぜひお試しください。

1行ずつ読み込む方法とコメント部分を除外する方法についての解説は本記事ではしません。ご了承ください。

特定の1行だけを読み込む方法

特定の1行だけを読み込む方法は、上のコードを少し書きかえるだけで済みます。
numが0の時はデータの1行目というようにnumと行に1対1の対応がついているので、例えば5行目だけを取得したいならif num == 4:とするだけで良いのです。
以下にサンプルコードと出力結果を示します。

import re

input_data = open('AvrgTmp_Kyoto2018.csv', 'r')

num = 0
for row in input_data:
    if not re.match('#', row):
        if num == 4:
            split_row = row.rstrip('\n').split(',')
            month = split_row[0]
            ave_temperature = split_row[1]
            print(month, ave_temperature)
        num += 1

input_data.close()
python input_file.py
# (実行結果)
# 5 20.0

まとめ

この記事では、Pythonを使ってファイルの特定の行だけを読み込む方法を解説してきました。
特定の行を読み込むには、numという行番号と1対1で対応するInt型の変数を定義する必要があります。
例えば、
・1行飛ばしで読み込む場合は、if num % 2 == 0: 剰余を使って条件分岐
・特定の1行だけ読み込む場合は、if num == 数字: 欲しい行(数字)を指定

してやることで、自分が必要とする行のデータを読み込むことが可能になります。