今回はpython3でcsvファイルを読み込む手順などについて書いていこうと思います
csvファイルの準備
前回、使用したファイルを流用して、次のようなcsvファイルを使うことにします。
#下の枠の中の内容だけをテキストファイルにかいて、名前を「(なんか適当な名前).csv」で保存する。ここでは、sample.csvにしてます。
3,2,7,8
5,11,1,5
13,4,2,3
csvファイルの読み込み(と表示)
まず、一番シンプルな、「読み込んで、内容を表示する」だけの処理は、もうすでにたくさんの他の人のブログやサイトなどでも紹介し尽くされているような気もしますが、こう書くそうです。
# ややくどいというか、冗長な補足かもしれませんが、import csv以下の内容をテキストファイルに書いて、「(適当な名前).py」で保存。ここでは、一応「open.py」。そして、先ほど用意したsample.csvのファイルと今のopne.pyのファイルは同じフォルダ(ディレクトリ)に置いておく。
import csv
f = open("sample.csv")
reader = csv.reader(f)
for row in reader:
print(row)
f.close()
先ほど用意したsample.csvのファイルと今のopne.pyのファイルは同じフォルダ(ディレクトリ)に置きます。
そしてターミナルにて、カレントディレクトリをsample.csvとopen.pyが置いてあるフォルダに移動します。
そうしたら、またターミナルで次のコマンドを打つとcsvファイルの中身が表示されます。
($のマークより前は中略・・・)$ python3 open.py # 「python3 open.py」と打ってreturnを押す。
とすると、
['3', '2', '7', '8']
['5', '11', '1', '5']
['13', '4', '2', '3']
csvファイルの列だけ抽出
上の実行結果をみて推察されるように、csvファイルとして読み込むと、「各行を要素にもつリスト」として読み込まれます。(その各行それぞれもリストなわけですが。リストを要素にもつリスト、ということ)
いや、読み込まれます、とかいってますが、自分はあまりリストとイテレータの違いがよくわかっていません。
もしかしたら「イテレータとして読み込まれます」という表現が正しいのかも知れませんが、ここではとりあえずそのあたりには触れないようにします。
どなたか説明できる方がいれば教えてください。
なので、
import csv
f = open("sample.csv")
reader = csv.reader(f)
for row in reader:
print(row[2])
f.close()
とすれば、実行結果は
7
1
2
となります。
言葉で表現するとやや紛らわしいですが、あえて表現してみると、「各行」がそれぞれリストの要素になっているわけですが(各行それ自体もリスト)、各行から3番目の要素を取り出す(くどいですが、誤植ではないです。3番目の要素。)という操作を各行に対して行う、という意味です。
readerオブジェクトの型と属性を調べてみる
上の部分で「「各行」がそれぞれリストの要素になっているわけですが」とか書いてますし、ネット上のドキュメントを読んでもそう書いてはあるのですが、書いてあるからと信用できないのが自分。
自分で確認できたことになるのかどうかすらも不明ですが、わからないなりにやるだけやってみました。
型を調べる
type関数を使うらしいです。
こんなコードを書いてみます。
import csv
f = open("sample.csv")
reader = csv.reader(f)
for row in reader:
print(row)
print(type(reader))
f.close()
実行するとこうなります。
['3', '2', '7', '8']
['5', '11', '1', '5']
['13', '4', '2', '3']
#この部分がtype関数に対する実行結果。
持っている属性を調べる
属性を調べるのはdir関数です。
先のコードに追加して次のようなコードにします。
import csv
f = open("sample.csv")
reader = csv.reader(f)
for row in reader:
print(row)
print(type(reader))
for e in dir(reader):
print(e)
f.close()
実行すると、次のようになります。
['3', '2', '7', '8']
['5', '11', '1', '5']
['13', '4', '2', '3']
__class__ # この行より以下がdir関数に対する実行結果。
__delattr__
__dir__
__doc__
__eq__
__format__
__ge__
__getattribute__
__gt__
__hash__
__init__
__iter__
__le__
__lt__
__ne__
__new__
__next__
__reduce__
__reduce_ex__
__repr__
__setattr__
__sizeof__
__str__
__subclasshook__
dialect
line_num