プロが教えるわが家の防犯対策術!

python初心者です。
mac上で、csvファイルからデータを読み込んでデータベースを作りたいのですが…
csvの中身は、例えば
ID, 名字,名前, 年齢, 出身地
1, 山田, 太郎, 30, 大阪
2, 田中, 和夫, 55, 千葉
...
のような、極めてシンプルな感じです。

色々調べて、エンコードの問題があることは理解しましたが、web上の解決策を試してもなぜかうまく行きません。(python2.7です。)

#coding:utf-8
import csv
inputfile = open(u'data.csv', 'rU')
reader = csv.DictReader(inputfile)
for r in reader:
print r

とすると、1行ずつ読み込めてはいますが、printしたときの日本語が読めません。
どうすれば良いのでしょうか?

また、読めないですが、プログラム内でデータのやり取りをする分には問題ないのでしょうか?
(例えば、1番とX番の出身地が同じ、の判定をするとか)

非常に基本的な問題だと思うのですが、sqlでデータベースを作る前のこの段階で躓いて、全然前に進めずにいます(>_<)
どうか教えて下さい、宜しくお願いします。

A 回答 (2件)

あなたの言う「文字化け」とは、どんな状態なのでしょうか?



{'\xe5\x90\x8d\xe5\x89\x8d': ' \xe5\xa4\xaa\xe9\x83\x8e', ...
もし、こういう状態のものを指しているのなら、正しい動作です。

reader = csv.DictReader(inputfile)
for r in reader:
で辞書(dict型)として読み込んだr を
print r
で出力しています。
このようにdictをそのままprintすると、 {key1:val1, key2:val2,. ... } といった形式で出力されます。
このとき、key,val が文字列だった場合、ASCII(いわゆる半角英数記号)以外は \ を使ったエスケープシーケンスで出力されます。

'\xe5\x90\x8d\xe5\x89\x8d'

'名前' のUTF-8でのバイト列です。

for r in reader:
  print r
  for k,v in r.items():
    print k,v
のように、辞書rから鍵と値を取り出してprintすれば、文字列の出力となります。
これらの違いは、出力方法の違いであって中身は同じです。



> プログラム内でデータのやり取りをする分には問題ないのでしょうか?
> (例えば、1番とX番の出身地が同じ、の判定をするとか)

難しいところです。
同じ文字コードで単純に==かどうか、程度の比較なら問題ありません。
しかし、正規表現を使ったり、文字数を数えたり、といった場合には、問題が発生します。

UTF-8の場合「名」という一文字が[\xe5\x90\x8d」という3文字から構成されています。
そのままprintすると1文字に見えますが、内部ではそれぞれ別の文字として扱います。

漢字を1文字として扱った方が便利な場合、unicode文字列を使う、というのが、Pythonでの常套手段です。
ですが、 csv モジュールでは unicodeに対応していません
http://docs.python.jp/2/library/csv.html
python unicode csv
で検索すると、unicodeに対応させる方法等が見つかるので、それを使いましょう

この回答への補足

お礼と補足を入力したつもりだったのですが、反映されておらず、遅くなって申し訳ありません。
丁寧にご回答頂いてありがとうございます。よく分かりました。

文字化けについてはその通り(\xe5\…という状態)で、正常な動作だと分かり安心しました。

それで、教えて頂いた書き方を試したのですが、今度は、英語は表示されますが日本語は�h�A�p�l という感じになってしまいます。
これは、どの文字コードで表示されている事になるのでしょうか…?

unicodeへの対応、試してみます。

それから、python3にすればこの問題は起きない、という理解で正しいですか?
そうだとすれば、これから学習するので3系にしようかな、とも思い始めました…。

再度の質問で申し訳ありませんが、アドバイス頂ければ幸いです。

ありがとうございます。

補足日時:2014/05/24 13:55
    • good
    • 0

str文字列を使う場合、printすれば、変換等無しに、そのまま、ターミナルに出力されます。



cat test.csv
と、CSVファイルをそのまま端末に出力したら、同じ文字化けするのでは?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!