liquidjumper Python Pythonで読み込んだCSVの一行目をスキップする方法

Pythonで読み込んだCSVの一行目をスキップする方法

python_next_iter_skip_the_first_line_topimage

Pythonでファイルを読み込んだ際に、「一行目は必要無い!」。そんなときはありませんか?

例えば区切り形式で記述されたCSVファイルや、テキストファイルの一行目に書かれた表題などと言えば分かるでしょうか?

ファイル自体にとっては、中身のデータやテキストの内容を示すもので大事なのですが、そのデータやテキストをPythonに取り込み、何かしら処理を行いたい場合は、無駄?邪魔?でしかありません。

例として作成したcsvファイルをPythonで読み込むと

import csv

CSV_FILE = "csv_test_data.csv"

with open(CSV_FILE , "r") as csvfile_open: #open関数で読み込み専用でオープンし、変数[csvfile_open]に代入
    csvfile_read = csv.reader(csvfile_open) #一行ずつ読み込み 

    for i_csvfile_read in csvfile_read: #for文で一行ずつ表示
        print(i_csvfile_read)


これを実行すると次のように出力されます。

['Model Number', 'Genre', 'Product name', 'price']
['DG2015W', 'CHAIR', 'SUPERCHAIR (White)', '72000']
['DG2015B', 'CHAIR', 'SUPERCHAIR (Black)', '72000']
['DG2016W', 'DESK', 'SUPERDESK (White)', '150000']
['DG2017W', 'DESK', 'SUPERDESK (White)', '210000']
['DG2018W', 'DESK', 'SUPERDESK (White)', '250000']
['DG2018B', 'DESK', 'SUPERDESK (Black)', '250000']
['DG2023R', 'SIDE TABLE', 'SUPERTABLE (Red)', '35000']
['DG2023W', 'SIDE TABLE', 'SUPERTABLE (White)', '35000']

一行目には、その列に入力されている値の情報を示す内容が記述されてる事が多いかと。

データのファイルとしては必要なものではありますが、データそのものを扱いたい場合は無駄な情報です。

この無駄な情報が入っている「行」を、簡単に「スキップ」できたらPythonのスクリプト作成も楽になりますよね。

そんな、Pythonで読み込んだファイルの一行目を「スキップ」する場合は next関数 を使う方法が便利です。 

この記事では、Pythonで読み込んだファイルの一行目を、next関数を使って「スキップ」する方法を紹介します。


SAMURAI ENGINEER Plus+

Pythonのnext関数とは

まず next関数とは何なのかを説明したいと思いますが、今記事の目的

「読み込んだファイルの一行目を、スキップする」

方法を知りたいだけなのであれば、かる~く流してもらっても良いです。

ただ、この項目は、あくまでもnext関数の挙動と仕組みの紹介だけで、詳しく解説する内容ではありません。

ただ、処理の仕組みが理解できると応用する際にも役立つと思うので、流し読みしてもらえたらと思います。

イテレータの要素を取得するnext関数

next関数とは、Python公式ドキュメントによると

iterator の __next__() メソッドを呼び出すことにより、次の要素を取得します。イテレータが尽きている場合、 default が与えられていればそれが返され、そうでなければ StopIteration が送出されます。

Pythonドキュメント: https://docs.python.org/ja/3/library/functions.html?highlight=iter#next


要約すると、「イテレータの要素を一つずつ取り出せる」関数になります。

「イテレータ」?

イテレータは要素を一つずつ取り出せる「仕組み?」「オブジェクト?」「ポインター?」

説明は人によって様々な様なので、知りたい方は他の詳しく解説されたサイトで調べてもらった方が良いのですが、

例えば、リストやタプルをfor文を使って一つずつ取り出す処理は頻繁に使ってますよね

この「リストから要素を取り出す」際にこっそり内部でイテレータオブジェクトが生成され、それにより、順番に要素が取り出す事が出来てるそうです。

なので、普段意識してはいませんが、リストから要素を取り出す処理を行っているなら、皆さん「イテレータ」を使っているという事になります。

そのイテレーターオブジェクトは手動でも生成できます。

作成したリストからiter関数でイテレーターオブジェクトを生成してみましょう。

イテレーターオブジェクトが生成されました。

>>> list = [1,2,3,4,5] 
>>> list_iter = iter(list) 
>>> print(list_iter)
<list_iterator object at 0x0000021CEE0DD3C8>

この生成したイテレーターオブジェクトから要素を順番に取り出せるのが next関数 です。

では、このイテレーターオブジェクトからnext関数を使って要素を取り出してみましょう。

next(イテレーターオブジェクト)

で要素を取り出せます。

print(next(list_iter))  と実行するとリストの1つ目の要素「1」が出力されました。

>>> list = [1,2,3,4,5] 
>>> list_iter = iter(list) 
>>> print(next(list_iter)) 
1

続けて同じコード print(next(list_iter)) を実行すると2つ目の要素「2」 が出力されました。

>>> list = [1,2,3,4,5] 
>>> list_iter = iter(list) 
>>> print(next(list_iter)) 
1
>>> print(next(list_iter)) 
2

更に連続して print(next(list_iter)) を実行し、要素が無くなると StopIteration が送出されます。

>>> list = [1,2,3,4,5] 
>>> list_iter = iter(list) 
>>> print(next(list_iter)) 
1
>>> print(next(list_iter)) 
2
>>> print(next(list_iter)) 
3
>>> print(next(list_iter)) 
4
>>> print(next(list_iter)) 
5
>>> print(next(list_iter)) 
Traceback (most recent call last):
  File "<input>", line 1, in <module>
StopIteration

これは、どういう事なのか?

next関数で、リストから生成したイテレーターオブジェクトの要素を、

「何も無くなるまで、順番に一つずつ送出」できたという事です。

なんとなくイメージ出来たしょうか?


next関数を使って一行目をスキップする

next関数について簡単に説明しました。

では、このnext関数の挙動を読み込んだデータに適用したらどうなるのか。

“一行ずつ順番に行を減らせる”

つまり、読み込んだデータの 必要無い行を出力して、必要な行が残せる という事。

本記事で使ってるcsvファイルであれば、一回next関数を記述して一行目を出力するだけで、二行目以降の純粋なデータのみ残すことが出来るということになります。

それでは、先程のcsvファイルを読み込んだスクリプトに、next関数を追加して実行してみましょう。

import csv

CSV_FILE = "csv_test_data.csv"

with open(CSV_FILE , "r") as csvfile_open:
    csvfile_read = csv.reader(csvfile_open)
    csvfile_header = next(csvfile_read) #next関数で一行目を出力

    for i_csvfile_read in csvfile_read: #二行目以降の行を出力
        print(i_csvfile_read)

実行すると、入力されている値の情報を示す一行目がスキップされ、二行目以降の純粋なデータのみが出力されました

これで、Pythonスクリプトでも扱いやすいデータになったのではないでしょうか。

['DG2015W', 'CHAIR', 'SUPERCHAIR (White)', '72000']
['DG2015B', 'CHAIR', 'SUPERCHAIR (Black)', '72000']
['DG2016W', 'DESK', 'SUPERDESK (White)', '150000']
['DG2017W', 'DESK', 'SUPERDESK (White)', '210000']
['DG2018W', 'DESK', 'SUPERDESK (White)', '250000']
['DG2018B', 'DESK', 'SUPERDESK (Black)', '250000']

まとめ:Pythonで読み込んだファイルを行毎にコントロールする場合はnext関数

Pythonで読み込んだファイルの一行目を、next関数を使って「スキップ」する方法を紹介しました。

読み込んだ内容の一行目をスキップする方法は他にもあるとは思いますが、コードを一行追加するだけのこの方法は、条件処理も必要なく非常に簡単です。

Pythonでファイルを読み込み、データ処理をする必要がある場合には、是非試してみてください。





 最新のゲーミングPCが安く手に入れられる「 FRONTIER 」

 豊富なカスタマイズメニューで、あなた好みの1台が購入できます。

 人気の秘密は何と言ってもコスパの高さ。
 最新のCPU・GPUパーツを搭載したモデルを驚きの価格で提供。

 山口県の自社工場で組み立てられ徹底した試験・検査後に出荷。
 無償修理サービスもありサポート体制も安心。

 コスパに徹底的にこだわる方は公式サイトへ >> 【FRONTIER】


Twitter Facebook Pocket LINE はてブ

おすすめの関連記事


あわせてよく読まれている記事