pythonでcsvファイルを読み込む方法について紹介します。
本記事では、以下の内容を紹介しています。
この記事で分かること
■はじめに:csvファイルについて
■csvモジュールを用いて、csvファイルを読み込む方法
- リストとして読み込み
- 辞書として読み込み
■pandasを用いて、csvファイルを読み込む方法
■numpyを用いて、csvファイルを読み込む方法
■【補足】csvファイルを1行ずつ読み込む方法
スポンサーリンク
はじめに:csvファイルについて
csvファイルは、"カンマ" 区切りのテキストファイルになっています。
そのため、テキストファイルとして読み込んで "カンマ" で分割すれば、ちからわざで処理することもできます。
ただ、そんな面倒なことをしなくても、本記事で紹介する「csvモジュール」などのモジュールを使用することで、より簡単にcsvファイルを扱うことができるようになります。
はじめに、本記事のサンプルコードで使用しているcsvファイルの中身について紹介します。
csvファイルの中身は以下のとおりとなっています。
### csvファイルをテキストとして読み取り
import csv
import os
dir_path = r'C:\ *--- 任意のディレクトリ ---* '
file_name = 'test.csv'
file_path = os.path.join(dir_path, file_name)
with open(file_path, encoding = 'utf-8') as f:
print(f.read())
"""
Fruit,Origin,Price
Apple,Aomori,150
Banana,Ecuador,200
Orange,America,100
Grape,Yamanashi,500
Lemon,Hiroshima,100
"""
上記のサンプルコードについて、少し補足します。
> with open( file_path, encoding = 'utf-8' ) as f:
csvファイルをwith文で開き、ファイルオブジェクトを生成しています。
> print( f.read() )
ファイルオブジェクトをreadメソッドで開き、ファイルの中身を表示しています。
csvファイルのデータが、 "カンマ区切り" になっていることが確認できると思います。
csvファイルをカンマで分割して処理
参考までに、テキストファイルとして読み込んだcsvファイルを、"カンマ" で区切って泥臭く処理する例を紹介します。
はじめに泥臭い方法を見ておくと、この後でcsvモジュールなどを紹介した際に、簡潔にcsvデータを扱えるということがより伝わるかと思います。
### csvファイルをテキストとして読み取り、カンマで分割
import csv
import os
import pprint
dir_path = r'C:\ *--- 任意のディレクトリ ---* '
file_name = 'test.csv'
file_path = os.path.join(dir_path, file_name)
with open(file_path, encoding = 'utf-8-sig') as f:
lines = f.readlines()
print(lines)
# ['Fruit,Origin,Price\n', 'Apple,Aomori,150\n', 'Banana,Ecuador,200\n', 'Orange,America,100\n', 'Grape,Yamanashi,500\n', 'Lemon,Hiroshima,100\n']
lines_s = [ line.strip() for line in lines]
print(lines_s)
# ['Fruit,Origin,Price', 'Apple,Aomori,150', 'Banana,Ecuador,200', 'Orange,America,100', 'Grape,Yamanashi,500', 'Lemon,Hiroshima,100']
lines_split = [ line_s.split(',') for line_s in lines_s]
pprint.pprint(lines_split)
"""
[['Fruit', 'Origin', 'Price'],
['Apple', 'Aomori', '150'],
['Banana', 'Ecuador', '200'],
['Orange', 'America', '100'],
['Grape', 'Yamanashi', '500'],
['Lemon', 'Hiroshima', '100']]
"""
> lines = f.readlines()
ファイルオブジェクトのreadlinesメソッドで、ファイルを行ごとに読み込み、リストとして取得しています。
> lines_s = [ line.strip() for line in lines ]
readlinesメソッドで読み込んだ行ごとのデータには、改行コードが含まれるため、内包表記とstripメソッドを用いて、改行コードを取り除いています。
> lines_split = [ line_s.split(',') for line_s in lines_s ]
内包表記とsplitメソッドを用いて、カンマで要素を区切っています。
泥臭い方法ですが、csvファイルをリストの形で取得することができました。
なお、テキストファイルを読み込む方法については、下記の記事で紹介しています。
readメソッド、readlinesメソッドについても紹介しています。
テキストファイルの読み込み方法【read、readlines、readline】
内包表記については、下記の記事で紹介しています。
スポンサーリンク
csvモジュールを用いて、csvファイルを読み込み
では、ここから、pythonの標準モジュールである「csvモジュール」を用いてcsvファイルを読み込む方法を紹介します。
「csvモジュール」は、pip等でインストールすることなく使用できます。(ただし、importは必要です)
本記事では、csvモジュールを用いて、csvファイルをリストとして取得する方法と、csvファイルを辞書として取得する方法を紹介します。
csvファイルをリスト(list)で読み取り【csvモジュール】
はじめに、csvモジュールを用いて、csvファイルをリストとして取得する方法を紹介します。
以下、サンプルコードです。
### csvモジュールで、csvファイルをリストで取得
import csv
import os
import pprint
dir_path = r'C:\ *--- 任意のディレクトリ ---* '
file_name = 'test.csv'
file_path = os.path.join(dir_path, file_name)
rows = []
with open(file_path, encoding = 'utf-8-sig') as f:
reader = csv.reader(f)
for row in reader :
rows.append(row)
pprint.pprint(rows)
"""
[['Fruit', 'Origin', 'Price'],
['Apple', 'Aomori', '150'],
['Banana', 'Ecuador', '200'],
['Orange', 'America', '100'],
['Grape', 'Yamanashi', '500'],
['Lemon', 'Hiroshima', '100']]
"""
> with open( file_path, encoding = 'utf-8-sig' ) as f :
with文で、csvファイルを開き、ファイルオブジェクトを生成しています。
> reader = csv.reader( f )
csvファイル内の行を反復処理する、 reader オブジェクトを生成しています。
生成されたreaderオブジェクトは、イテレータプロトコルに対応しているため、for文やnextで行分のデータを取得できます。
readerオブジェクトから取得した行分のデータは、appendメソッドでリストに追加しています。
参考までに、ヘッダーを別扱いする場合の例も紹介します。
nextで、ヘッダー部分のみ先に取得しています。
また、readerオブジェクトから行データを取得する部分を、内包表記に変更しています。
### csvモジュールで、csvファイルをリストで取得(ヘッダーを別処理)
import csv
import os
import pprint
dir_path = r'C:\ *--- 任意のディレクトリ ---* '
file_name = 'test.csv'
file_path = os.path.join(dir_path, file_name)
rows = []
with open(file_path, encoding = 'utf-8-sig' ) as f:
reader = csv.reader(f)
header = next(reader)
print(header)
# ['Fruit', 'Origin', 'Price']
rows = [row for row in reader]
rows.insert(0, header)
pprint.pprint(rows)
"""
[['Fruit', 'Origin', 'Price'],
['Apple', 'Aomori', '150'],
['Banana', 'Ecuador', '200'],
['Orange', 'America', '100'],
['Grape', 'Yamanashi', '500'],
['Lemon', 'Hiroshima', '100']]
"""
csvファイルを辞書(dict)で読み取り【csvモジュール】
次に、csvモジュールを用いて、csvファイルを辞書として取得する方法を紹介します。
以下、サンプルコードです。
### csvモジュールで、csvファイルを辞書で取得
import csv
import os
import pprint
dir_path = r'C:\ *--- 任意のディレクトリ ---* '
file_name = 'test.csv'
file_path = os.path.join(dir_path, file_name)
rows = []
with open(file_path, encoding = 'utf-8-sig' ) as f:
reader = csv.DictReader(f)
rows = [row for row in reader]
pprint.pprint(rows)
"""
[OrderedDict([('Fruit', 'Apple'), ('Origin', 'Aomori'), ('Price', '150')]),
OrderedDict([('Fruit', 'Banana'), ('Origin', 'Ecuador'), ('Price', '200')]),
OrderedDict([('Fruit', 'Orange'), ('Origin', 'America'), ('Price', '100')]),
OrderedDict([('Fruit', 'Grape'), ('Origin', 'Yamanashi'), ('Price', '500')]),
OrderedDict([('Fruit', 'Lemon'), ('Origin', 'Hiroshima'), ('Price', '100')])]
"""
print(rows[1])
# OrderedDict([('Fruit', 'Banana'), ('Origin', 'Ecuador'), ('Price', '200')])
print(rows[1]['Origin'])
# 'Ecuador'
> reader = csv.DictReader(f)
csv.DictReaderを用いることで、辞書型のreaderオブジェクトを生成できます。
csv.readerの場合と同様に、イテレータプロトコルに対応しているので、for文やnextで行分のデータを取得できます。
readerから行分のデータを取り出し、内包表記を用いて、リスト "rows" に追加しています。
OrderedDict( 順序付き辞書 )は、通常の辞書と同様に操作できます。
> print(rows[1]['Origin'])
> 'Ecuador'
キーを指定し、値を表示できています。
スポンサーリンク
pandasを用いて、csvファイルを読み込み
pythonのデータ解析支援ライブラリである「pandas」を用いて、csvファイルを読み込む方法を紹介します。
pandasの関数である、read_csv関数を使用することで、簡単にcsvファイルを読み込むことができます。
基本の書き方
import pandas as pd
df = pd.read_csv( csvのパス )
以下、pandasのread_csv関数を用いて、csvファイルを読み込むサンプルコードです。
### pandasを用いて、csvファイルを読み込み
import pandas as pd
import os
dir_path = r'C:\ *--- 任意のディレクトリ ---* '
file_name = 'test.csv'
file_path = os.path.join(dir_path, file_name)
df = pd.read_csv(file_path)
print(df)
"""
Fruit Origin Price
0 Apple Aomori 150
1 Banana Ecuador 200
2 Orange America 100
3 Grape Yamanashi 500
4 Lemon Hiroshima 100
"""
DataFrameの形式で、簡単にcsvファイルを読み込むことができています。
numpyを用いて、csvファイルを読み込み
pythonの数値計算を効率的に行うためのライブラリである「numpy」を用いて、csvファイルを読み込む方法を紹介します。
pandasの関数である、loadtxt関数を使用することで、csvファイルを読み込むことができます。
csvはカンマ区切りであるため、引数として、カンマ区切りを指定する必要があります( delimiter = ',' )。
基本の書き方
import numpy as np
data = np.loadtxt ( csvのパス, delimiter = ',' )
以下、numpyのloadtxt関数を用いて、csvファイルを読み込むサンプルコードです。
### numpyを用いて、csvファイルを読み込み
import numpy as np
import os
dir_path = r'C:\ *---任意のディレクトリ---* '
file_name = 'test_numpy.csv'
file_path = os.path.join(dir_path, file_name)
data = np.loadtxt( file_path, encoding = 'utf-8-sig', delimiter = ',' )
print(data)
"""
[[11. 12. 13. 14. 15.]
[21. 22. 23. 24. 25.]
[31. 32. 33. 34. 35.]]
"""
csvを1行ずつ読み込み
補足的な内容として、csvファイルを1行ずつ読み込む方法を紹介します。
以下2つの方法を紹介します。
- ファイルオブジェクトのreadlineメソッドを使用して、1行ずつ読み込み
- csvモジュールを使用して、1行ずつ読み込み
なお、csvモジュールを用いた方法については、すでに紹介した方法と同じ内容です。
readlineメソッドを使用して、csvファイルを1行ずつ読み込み
ファイルオブジェクトのreadlineメソッドを使用して、csvファイルを1行ずつ読み込む方法を紹介します。
以下、サンプルコードです。
### readlineメソッドを用いて、1行ずつ読み込み
import os
dir_path = r'C:\ *--- 任意のディレクトリ ---* '
file_name = 'test.csv'
file_path = os.path.join(dir_path, file_name)
with open(file_path, encoding = 'utf-8-sig') as f:
while True :
line = f.readline()
line_s = line.strip()
print(line_s)
if not line :
break
"""
Fruit,Origin,Price
Apple,Aomori,150
Banana,Ecuador,200
Orange,America,100
Grape,Yamanashi,500
Lemon,Hiroshima,100
"""
line = f.readline( )
readlineメソッドは、ファイルオブジェクトからデータを1行ずつ取得することができます。
whileループ内でreadlineメソッドを使用することで最後の行まで取得しています。
なお、冒頭で紹介した、readlinesメソッドとは異なるので、注意してください。
csvモジュールを使用して、csvファイルを1行ずつ読み込み
csvモジュールを使用して、csvファイルを1行ずつ読み込む方法を紹介します。
この方法はすでに紹介済みです。
以下、サンプルコードです。
### csvモジュールを用いて、1行ずつ読み込み
import os
import csv
dir_path = r'C:\ *--- 任意のディレクトリ ---* '
file_name = 'test.csv'
file_path = os.path.join(dir_path, file_name)
with open(file_path, encoding = 'utf-8-sig') as f:
reader = csv.reader(f)
for row in reader :
print(row)
"""
['Fruit', 'Origin', 'Price']
['Apple', 'Aomori', '150']
['Banana', 'Ecuador', '200']
['Orange', 'America', '100']
['Grape', 'Yamanashi', '500']
['Lemon', 'Hiroshima', '100']
"""
スポンサーリンク
まとめ
pythonで、csvファイルを読み込む方法について紹介しました。
csvモジュールやpandasを用いると、簡単にcsvファイルが読み込めます。便利なモジュール・ライブラリなので、基本的な使い方は覚えておくようにしましょう。
スポンサーリンク