Pythonの学習の過程とか

学習の記録をつけておきましょう。Python3に少しずつ移行していきます。過去の記事のソースを2から3に、、、と考えましたが、新しいことをやったほうがいいですね。

Pythonの基礎 ファイル(CSV)を読み込む編

PythonCSVファイルを読み込んでみる

テキストファイルに続き、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の読み込みはこれくらいにしておきましょう。

初めてのPython 第3版

初めてのPython 第3版