好きなものだけ書く。ポジティブに。

好きなことを楽しく。プログラミング、写真、音楽、ガジェットとか。

python2系の unicode/str とか encode, decode 関数の魔境

100% プログラムの話しです。

f:id:noblejasper:20161103120644p:plain

python2系の文字列は魔境。 ちょっと整理しようと思います。

str型、unicode

まず、文字列を扱うには2つの型がある。 str型と、unicode型。

基本的にはunicode型を使うようにすると間違いは少なさそう。

個別に調べていってみましょう

続きを読む

python2.7系 csv モジュールでの書き込みは unicode型はNG!

プログラムの話しでっす。

結論

csvモジュールで書き込みする時は、unicode型はダメです。 str型で文字コードUTF-8なもので統一しましょう。

サンプル

# coding=utf-8

import csv

sample_header = [u"col{}".format(i) for i in range(1, 6)]
sample_data = [
  [u"あ", u"い", u"う", u"え", u"お"]
]

with open('/tmp/sample.csv', "wb") as fh:
    writer = csv.writer(fh, lineterminator=u'\n')
    writer.writerow(sample_header)
    for row in sample_data:
        row = [x.encode("utf-8") for x in row]
        writer.writerow(row)

ざっくり解説

元のデータがunicode型で渡ってきて(サンプルの sample_data のように) そのまま書き込もうとすると以下のようなExceptionを吐きます。

Traceback (most recent call last):
  File "sample.py", line 14, in <module>
    writer.writerow(row)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u3042' in position 0: ordinal not in range(128)
[Finished in 0.264s]

unicodeで渡ってきた時には .encode("utf-8") すれば str型になるので csv モジュールもすんなり飲み込んでくれるようです。

2016/11/02 気になるニュース、ためになった記事を随時まとめていく

サービス

ゲーム

ビジネス

2016/10/31 & 2016/11/01 気になるニュース、ためになった記事を随時まとめていく

週明けて31日月末!月曜日! 31日はまとめられなかったので、2日分です! 土日に撮った写真の記事とかもあげたいけど、2日の夜中になりそう。

モノ

サービス

ビジネス

音楽

そういえばRADWIMPSが一部だけどAppleMusicで聴けるんですね。GooglePlayでも再生出来るようになってた。

2016/10/28 気になるニュース、ためになった記事を随時まとめていく

apple and twitter

昨日TwitterとFBで連携してみた。

技術系

モノ

サービス

ゲーム

ビジネス

今日はなし

カメラ

今日はなし

グルメ

今日はなし