ファイル・フォルダ操作 文法・環境 標準ライブラリ・モジュール

【python】csvファイルの読み込み【csvモジュール、pandas、numpy】

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ファイルが読み込めます。便利なモジュール・ライブラリなので、基本的な使い方は覚えておくようにしましょう。

スポンサーリンク

-ファイル・フォルダ操作, 文法・環境, 標準ライブラリ・モジュール
-, ,