文字コードがUTF-8のCSVファイルを読み込む

絶対忘れるので書いておく。

まず、pythoncsvを読み込むには、csv.reader() を使う。
これは、1行分のデータが配列になって帰ってくるものなので、項目の何番目は何の項目、ってのを自分でわかっている必要がある。

次に、csvファイルの先頭行をヘッダとして使ってくれる、csv.dictReader() というのがある。
こんなふうに使う。
test.csv (文字コードUTF-8とする)

id, name, value
101, 名前1, 1000
102, 名前2, 2000
103, 名前3, 3000
…

プログラム

ROOTPATH = os.path.dirname(__file__)
FILEPATH = os.path.join(ROOTPATH, "test.csv")

f = open(FILPATH, "rb")
try:
    rows = csv.DictReader(f)
    for row in rows:
        print row["id"]
        print row["name"] #文字化けしちゃう
        print row["value"]
finally:
    f.close()

しかしながら、このままではマルチバイト系に対応していない。上記の例だと、"name"列の値をprintしている箇所は文字化けしてしまう。これを解消するため、Unicodeに変換するラッパーメソッドを作る。

def UnicodeDictReader(utf8_data, **kwargs):
    rows = csv.DictReader(utf8_data, **kwargs)
    for row in rows:
        yield dict([(key, unicode(value, "utf-8")) for key, value in row.iteritems()])

ROOTPATH = os.path.dirname(__file__)
FILEPATH = os.path.join(ROOTPATH, "test.csv")

f = open(FILPATH, "rb")
try:
    rows = UnicodeDictReader(f)
    for row in rows:
        print row["id"]
        print row["name"] #文字化けしない
        print row["value"]
finally:
    f.close()

yieldがポイント!!!