スポンサーリンク

このドキュメントの内容は、以下の通りです。

はじめに


世の中には、いろいろなデータが公開されていますが、データが提供されるフォーマットにいろいろありますが、その1つに、CSVが使われることがよくあります。たとえば、証券会社の1つであるSBI証券オンラインサイトでは、取引の履歴を CSVファイルでダウンロードできるところがあります。

CSVを扱う場合、マイクロソフトの開発した神アプリケーションの エクセル(Excel) を利用して、いじり倒すことも可能です。エクセルは持ってないよ、という場合には、 Open Office などを使うのもよいかもしれませんが、プログラムでもっといじり倒したい場合には、Python などのプログラミング言語が良いかもしれません。

ここでは、Python で CSVファイルを扱う方法を紹介いたします。また、巨大なCSVファイルの扱いについても紹介します。

CSVとは

CSVとは Comma Separated Values (カンマセパレーテッドバリューズ) の略です。日本では、 しーえすぶいと読みます。CSV は、データをカンマで区切って、格納します。CSV なデータを格納したファイルを CSVファイルと呼びます。

プログラムでCSVファイルを扱う場合

CSVファイルでデータのやり取りをしているときに、CSVを読み込んで、処理をします。

CSVファイルをPythonで読み込んで、いろいろデータをいじり倒そうと思ったときに、1行1行読み込んで処理をすればいい場合ともっと先の行のデータまで処理が完了できない場合があると思います。

1行ずつ処理をする場合は、あまり困らないのですが、2行目、3行目のデータを含めて、1行目の処理をやり、2行目は、3行目から4行目、もしくは5行目まで必要となったときに、ファイルから1行ずつ読み込む方法だと、プログラミングが面倒になるかもしれません。いっそ、はじめから全部、リストや配列といったデータ構造に入れてしまったほうがプログラミングしやすくなると思います。

ライブラリを利用する

CSVファイルを読むには、どのようにしたらよいでしょうか?単純に考えると、以下の手順を考えるかと思います。

1. CSVファイルを開く
2. CSVファイルを一行一行読み込む
3. 読み込んだ行をパースする
4. パースしたデータを処理する
5. CSVファイルを閉じる

主にやりたかったことは、4番ですよね。以外と厄介なのは、3番のパースの処理ではないかと思います。

プログラムを書くたびに、CSVの行のパースの処理を書くと考えると、ぞっとします。自分でバグを埋め込んでしまう可能性が高まるからです。プログラムはできるだけ自分で書かないほうが良いと考えています。

バグを作らず、やりたい処理に集中するために、CSVファイルの処理は、主にライブラリに任せるのがよいと考えます。

Python には、 csvというモジュールもあります。また、データ解析を支える機能を提供する pandas というモジュールがあります。

pandasとは

Pythonのpandasとは、データ解析を支援する機能を提供するモジュールです。データに対して、簡単に処理を行う仕組みをもっていて、CSVのデータの処理にも向いてます。

解決方法

Pythonでは、pandasモジュールを使えば、CSVを読み込み、リストにする、といったことが2行で書けます。

インストール

pandasモジュールをインストールします。pip コマンドを使えば、簡単にインストールできます。pip が使える環境であれば、以下のコマンドでインストールできます。
sudo pip install pandas

Ubuntu では、aptコマンドでもインストールできます。
sudo apt install python-pandas

FreeBSD では、pkgコマンドでもインストールできます。
sudo pkg install py27-pandas
sudo pkg install py36-pandas

pandasを用いたプログラミング

CSV を pandas を使って、リストに読み込む方法です。
import pandas as pd
data = pd.read_csv("foo.csv").values.tolist()
これだけでリストになります。非常に簡単ですね。

テストデータは以下のものとします。
a,10
b,20
c,30
d,40
e,50
f,60

上記のテストデータでプログラムを実行してみます。 data の中身は以下の通りになります。
[['b', 20], ['c', 30], ['d', 40], ['e', 50], ['f', 60]]

上記の実行結果を見て、おかしいな?と思われた方もいらっしゃるかと思います。 CSVの先頭行に a ではじまる行がありますが、下記のリストから消えてしまっています。これは、 pandas が1行目をヘッダ行として、スキップしてしまったからです。

1行目をスキップしたくない場合は、read_csvの引数に header=None を指定し、ヘッダはありません、ということを pandas に教えてあげる必要があります。

import pandas as pd
data = pd.read_csv("foo.csv", header=None).values.tolist()
print(data)

上記のようにコードをなおして、実行した場合、 data は、以下のリストを保持しています。

[['a', 10], ['b', 20], ['c', 30], ['d', 40], ['e', 50], ['f', 60]]

csvモジュールを用いた方法

pandasモジュールを使わずに、csvモジュールとpythonだけでリストを作る場合は、以下の通りです。
import csv
f = open("foo.csv", "r")
reader = csv.reader(f)
data = [ e for e in reader ]
print(data)
f.close()

pandasに比べると、少しコードが長くなりました。しかしながら、モジュールを使わずに、自力で CSV をパースするようなコードは書かなくてよいので、モジュールを使うことで、ずいぶん労力と時間の削減になっていると思います。

csv モジュールの場合は、デフォルトの動作でヘッダをスキップすることがないため、下記のように先頭行もリストに含まれています。
[['a', '10'], ['b', '20'], ['c', '30'], ['d', '40'], ['e', '50'], ['f', '60']]

大容量CSVファイルを読み込む方法

ここでは、ビックデータ時代にあわせて、メインメモリよりも大きい容量の超巨大なCSVファイルがあったとします。巨大なファイルを一気に読み込もうとした場合、1プロセス当たりの使えるメモリの容量やメインメモリのサイズ以上の容量であれば、読み込みに失敗します。データによっては、ギガバイトサイズのデータが当たり前に使われていると思います。
一度に読み込みができない場合は、少しずつ読み込むしかありません。
1行ずつ、読む分には問題ありませんが、ある程度、まとめて読むというサンプルを以下に掲載します。

chunksize で読み込む行数をしています。ここでは、サンプルのデータが小さいので、2行としています。実際には、もっと大きな数字にしてください。
import pandas as pd
reader = pd.read_csv("/tmp/a.csv", chunksize=2, header=None)
for c in reader:
    print(c)

a.csv の中身は以下の通りです。
a,10
b,20
c,30
d,40
e,50
f,60

サンプルコードの実行結果は、以下の通りです。
余計な0と1が追加されているように見えますが、行番号と列番号です。
   0   1
0  a  10
1  b  20
   0   1
0  c  30
1  d  40
   0   1
0  e  50
1  f  60

上記の pandas の DataFrame から リストに変換する場合は、 tolist を利用します。
import pandas as pd
reader = pd.read_csv("/tmp/a.csv", chunksize=2, header=None)
for c in reader:
    print(c.values.tolist())

実行した場合、以下のように、3つのリストにわかれます。
[['a', 10], ['b', 20]]
[['c', 30], ['d', 40]]
[['e', 50], ['f', 60]]

Pythonに関する情報


python に関する情報は /python/ にまとめています。

pythonに関する書籍を探す


  • Python をアマゾンで探す
  • Python を楽天で探す
  • Python をヤフーショッピングで探す


スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー