Pythonの基礎 ファイル(CSV)を読み込む編
PythonでCSVファイルを読み込んでみる
テキストファイルに続き、CSVファイルを読み込んでみます。
CSVはカンマ区切りのテキストですから、テキストファイルと同じように読み込めばいいのですが、CSV用に便利なモジュールが用意されています。
その名もズバリ、"CSV"
では公式ページの参考にして、簡単な例をあげてみましょう。
#今回のCSVの中身 カンマで区切ったデータです。 1,11,111,1111,11111 2,22,222,2222,22222 3,33,333,3333,33333 4,44,444,4444,44444
#coding:utf-8 import csv #csvモジュールをインポートする f = open('data.csv', 'rb') dataReader = csv.reader(f) for row in dataReader: print row
#実行結果 ['1','11','111','1111','11111'] ['2','22','222','2222','22222'] ['3','33','333','3333','33333'] ['4','44','444','4444','44444']
とりあえず中身を無事に表示することはできましたが。。。。
見ての通り、リストとなっているようですね。
このやり方だと、ファイルの1行分を読み込み、カンマで区切ってリストにしています。
これでもできているとはいえますが、イマイチですよね。
では、この中身を見ていきます。
まずはファイルオブジェクトとしてファイルを開く
f = open('data.csv', 'rb')
この時点では、テキストファイルと同じやり方です。 fに開かれたファイルが関連づけられています。
二つ目の引数について
最初の引数はファイル名、二つ目はオープンモードです。 rで読み込み専用ですが、bがついていますね。 C言語の人には説明不要ですが、bは「バイナリモードで開く」の意味です。
公式サイトによると
csvfile がファイルオブジェクトの場合、ファイルオブジェクトの形式に違いがあるようなプラットフォームでは ‘b’ フラグを付けて開かなければなりません
だそうです。Windowsのこと? すみません、よく分からないです。。。。。 とりあえずcsvではbをつけておくことにします。
csv,readerでreaderオブジェクトを返す
dataReader = csv.reader(f)
またしても公式サイトから
与えられた csvfile 内の行を反復処理するような reader オブジェクトを返します
要するに、forやwhileで行を次々に読んでいけるような形式として読み込むという意味だと思います。
さらに
csv ファイルから読み込まれた各行は、文字列のリストとして返されます。データ型の変換が自動的に行われることはありません。
readerオブジェクトであるdataReaderは、1行ずつをリストとして返します。
表示はリスト形式になっていた、というのはこういうことだったんですね。
1行をそのまま出力する
for row in dataReader: print row
でもこれではちょっと読みにくいですね。
これでも構わないのですが、可読性を上げるには、[ ] と' 'を取り除いてみましょう。
リストの連結
公式サイトのサンプルにもありますが、joinでリストを連結することができます。
for row in dataReader: print ','.join(row)
ちなみにjoinは
iterable 中の文字列を結合した文字列を返します。文字列を結合するときの区切り文字は、このメソッドを適用する対象の文字列になります。
','.join(row)の、カンマが「連結する文字」でしょう。
#実行結果 1,11,111,1111,11111 2,22,222,2222,22222 3,33,333,3333,33333 4,44,444,4444,44444
となりました。 リストのひとつひとつをカンマで連結していったということですね。 クォーテーションが除去されたので、とても読みやすいと思います。
ちなみにカンマ以外の文字でも区切ることができるのか?
for row in dataReader: print '@'.join(row)
#実行結果 1@11@111@1111@11111 2@22@222@2222@22222 3@33@333@3333@33333 4@44@444@4444@44444
お、思った通りにできました。
ではこれをスペースにしたりすることもできそうです。
ちょっと話がそれましたが、csvの読み込みと、読み込んだ文字の扱いはなんとなく分かったと思います。
リストをひとつひとつ読み込んでいく
これもむずかしくないと思います。
- 1行読みこむ
- リストをひとつひとつ取り出す
#coding:utf-8 import csv #csvモジュールをインポートする f = open('data.csv', 'rb') dataReader = csv.reader(f) count = 0 for row in dataReader: print "line Num = %02d" % count for data in row: print data count += 1
#実行結果 line Num = 00 1 11 111 11111 111111 line Num = 01 2 22 222 22222 222222 line Num = 02 3 33 333 33333 333333 line Num = 03 4 44 444 44444 444444
forの入れ子でバッチリです!
forを使わないで連続して読み込むには?
大抵の場合にはforで済むと思いますが、それ以外に1行ずつ読み込んでいく方法を調べました。
csvreader.next()を使う
#coding:utf-8 import csv f = open('data.csv", 'rb') dataReader = csv.reader(f) row = dataReader.next() print row row = dataReader.next() print row row = dataReader.next() print row row = dataReader.next() print row
#実行結果 ['1', '11', '111', '11111', '111111'] ['2', '22', '222', '22222', '222222'] ['3', '33', '333', '33333', '333333'] ['4', '44', '444', '44444', '444444']
next()で次々に読み込んでくれます。
この例ではあまり有効な使いかたではありませんが、行ごとに処理を変える必要があるときなどは便利に使えそうですね。
とりあえずcsvの読み込みはこれくらいにしておきましょう。
- 作者: Mark Lutz,夏目大
- 出版社/メーカー: オライリージャパン
- 発売日: 2009/02/26
- メディア: 大型本
- 購入: 12人 クリック: 423回
- この商品を含むブログ (124件) を見る