今さらPython3 (51) - CSV

第8章。様々なテキストファイルを見ていく。まずはCSVから。

入門 Python 3

入門 Python 3

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の時には省略できなかった。

(つづく)