PythonでCSVファイルをリストに格納する方法
スポンサーリンク
このドキュメントの内容は、以下の通りです。
- はじめに
- CSVとは
- プログラムでCSVファイルを扱う場合
- ライブラリを利用する
- pandasとは
- 解決方法
- インストール
- pandasを用いたプログラミング
- csvモジュールを用いた方法
- 大容量CSVファイルを読み込む方法
- Pythonに関する情報
- pythonに関する書籍を探す
はじめに
世の中には、いろいろなデータが公開されていますが、データが提供されるフォーマットにいろいろありますが、その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に関する書籍を探す
スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 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