プログラミング勉強の備忘録

主にpythonやスマホアプリを作るためのプログラミングで勉強した内容を忘れないように記載していきます。

【Python】CSVファイルの読み込み

【はじめに】

今回はPythonでのCSVファイルの読み込み方法についてのメモです。

<実施環境>

【コードと説明】

今回はライブラリの「csv」を使用しますので、インポートします。

import csv

ライブラリの「csv」はPythonに標準で入っているため、インストールの必要はありません。

<コード一覧>

コード 説明
ファイル.read() 全文を取得
csv.reader(ファイル) forと組み合わせで行毎にリストで取得
quoting=csv.QUOTE_NONNUMERIC readerの引数、データをfloatで取得
<全文を取得>
# ファイル.read()
file_path = './test.csv'

with open(file_path, mode='r') as f:
    print(f.read())
# => a,b,c,13,14
#    d,e,f,23,24

CSVファイルもテキストファイルと同様に「read()」で全文を読み込みできます。ただ、この方法だとこの後に文章を何らかの方法で加工していく必要があります。

<forと組み合わせで行毎にリストで取得>
# csv.reader(ファイル)
import csv
file_path = './test.csv'

with open(file_path, mode='r') as f:
    reader = csv.reader(f)
    text = [row for row in reader]

print(text)
# => [['a', 'b', 'c', '13', '14'], ['d', 'e', 'f', '23', '24']]

最初にライブラリの「csv」をインポートしています。
「open」を使ってファイルを読み込みモードで開きます。
「reader」に「csv.reader」クラスを入れています。
引数にはファイルオブジェクト(今回だとファイルを「f」として開いているので「f」)を指定しています。
取得値は行毎にリストとなった2次元配列になります。
上記のサンプルを見ると、各値が「''」囲まれていることがわかります。これは文字列として取得しているということです。
CSVファイルでは数値データを取得することもあるため、これでは使い勝手が悪いです。解決方法としては下記になります。

import csv
file_path = './test.csv'

with open(file_path, mode='r') as f:
    reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
    text = [row for row in reader]

print(text)
# => [[11.0, 11.5, 1.05, 13.0, 14.0], [0.1, 0.2, 0.3, 23.0, 24.0]]

「reader」の引数に「# quoting=csv.QUOTE_NONNUMERIC」を入れることで取得値を全てfloat型で取得することができます。
上記例では「''」がついていないことがわかります。
ただし、データに数値以外が混ざっていると下記の様にエラーとなるため注意が必要です。

import csv
file_path = './test.csv'

with open(file_path, mode='r') as f:
    reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
    text = [row for row in reader]

print(text)
# => Traceback (most recent call last):
#   File "D:/Python/EditDocumentProject/test.py", line 6, in <module>
#     text = [row for row in reader]
#   File "D:/Python/EditDocumentProject/test.py", line 6, in <listcomp>
#     text = [row for row in reader]
# ValueError: could not convert string to float: 'a'

【後書き】

今回はCSVファイルの読み込み方法について記載しました。
引数などもまだある様ですが、今回は使用しなかったため、また機会があれば調べたいと思います。

【参考サイト】

今回の作業にあたり、下記サイトを参考にさせて頂きました。
note.nkmk.me