今さらPython3 (51) - CSV
第8章。様々なテキストファイルを見ていく。まずはCSVから。
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
CSV
いわゆるカンマ区切りファイルだけど、それ以外の文字がセパレータとして使われていたり、改行コードが違っていたり、セパレータそのものがデータに入っていたりなどの問題を考慮しないといけない。でも大丈夫。csvならね。
>>> import csv >>> villains = [ ... ['Doctor', 'No'], ... ['Rosa', 'Klebb'], ... ['Mister', 'Big'], ... ['Auric', 'Goldfinger'], ... ['Ernst', 'Blofeld'], ... ] >>> with open('villains', 'wt') as fout: ... csvout = csv.writer(fout) ... csvout.writerows(villains) ... >>>
withを使っているので、明示的にファイルをクローズする必要がない。villainsというリストをvillainsというcsvファイルに出力したという事が分かる。
Doctor,No Rosa,Klebb Mister,Big Auric,Goldfinger Ernst,Blofeld
吐かれたファイルの内容はこんな感じ。
>>> with open('villains', 'rt') as fin: ... cin = csv.reader(fin) ... villains = [row for row in cin] ... >>> print(villains) [['Doctor', 'No'], ['Rosa', 'Klebb'], ['Mister', 'Big'], ['Auric', 'Goldfinger'], ['Ernst', 'Blofeld']] >>>
今度はファイルを読み込んでいる。writer()で書き込んでreader()で読み込んでいる。
>>> with open('villains', 'rt') as fin: ... cin = csv.DictReader(fin, fieldnames=['first', 'last']) ... villains = [row for row in cin] ... >>> print(villains) [{'first': 'Doctor', 'last': 'No'}, {'first': 'Rosa', 'last': 'Klebb'}, {'first': 'Mister', 'last': 'Big'}, {'first': 'Auric', 'last': 'Goldfinger'}, {'first': 'Ernst', 'last': 'Blofeld'}] >>>
DictReader()で辞書のリストとして読み出すことも出来ると。項目名はパラメータとして受け渡している訳ですね。
>>> villains [{'first': 'Doctor', 'last': 'No'}, {'first': 'Rosa', 'last': 'Klebb'}, {'first': 'Mister', 'last': 'Big'}, {'first': 'Auric', 'last': 'Goldfinger'}, {'first': 'Ernst', 'last': 'Blofeld'}] >>> with open('villains', 'wt') as fout: ... cout = csv.DictWriter(fout, ['first', 'last']) ... cout.writeheader() ... cout.writerows(villains) ... >>>
出来たファイルを確認。
first,last Doctor,No Rosa,Klebb Mister,Big Auric,Goldfinger Ernst,Blofeld
同じ構造を持っているのに、敢えてヘッダを指定する感じがなんだかイケてないような。
>>> with open('villains', 'rt') as fin: ... cin = csv.DictReader(fin) ... villains = [row for row in cin] ... >>> villains [{'first': 'Doctor', 'last': 'No'}, {'first': 'Rosa', 'last': 'Klebb'}, {'first': 'Mister', 'last': 'Big'}, {'first': 'Auric', 'last': 'Goldfinger'}, {'first': 'Ernst', 'last': 'Blofeld'}]
ふむ。DictReader()の中で、fieldnameを省略する事が可能ならひょっとして、、、
>>> with open('villains', 'wt') as fout: ... cout = csv.DictWriter(fout) ... cout.writeheader() ... cout.writerows(villains) ... Traceback (most recent call last): File "<stdin>", line 2, in <module> TypeError: __init__() missing 1 required positional argument: 'fieldnames' >>>
writeの時には省略できなかった。
(つづく)