Pythonで日本語CSVからデータを読み込む方法について

このQ&Aのポイント
  • Pythonで日本語のCSVファイルからデータを読み込む方法について教えてください。
  • 読み込んだCSVファイルの中身が日本語で表示されない問題が発生しています。プログラム内でのデータのやり取りは問題ないのでしょうか?
  • 現在、Python初心者ですが、Mac上でCSVファイルからデータを読み込んでデータベースを作りたいです。解決策を試しても、うまくいかない状況です。
回答を見る
  • ベストアンサー

pythonで日本語csvからデータを読み込みたい

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でデータベースを作る前のこの段階で躓いて、全然前に進めずにいます(>_<) どうか教えて下さい、宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

あなたの言う「文字化け」とは、どんな状態なのでしょうか? {'\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に対応させる方法等が見つかるので、それを使いましょう

ooolxxxl
質問者

補足

お礼と補足を入力したつもりだったのですが、反映されておらず、遅くなって申し訳ありません。 丁寧にご回答頂いてありがとうございます。よく分かりました。 文字化けについてはその通り(\xe5\…という状態)で、正常な動作だと分かり安心しました。 それで、教えて頂いた書き方を試したのですが、今度は、英語は表示されますが日本語は�h�A�p�l という感じになってしまいます。 これは、どの文字コードで表示されている事になるのでしょうか…? unicodeへの対応、試してみます。 それから、python3にすればこの問題は起きない、という理解で正しいですか? そうだとすれば、これから学習するので3系にしようかな、とも思い始めました…。 再度の質問で申し訳ありませんが、アドバイス頂ければ幸いです。 ありがとうございます。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

str文字列を使う場合、printすれば、変換等無しに、そのまま、ターミナルに出力されます。 cat test.csv と、CSVファイルをそのまま端末に出力したら、同じ文字化けするのでは?

関連するQ&A

  • teraterm上でpythonを使いcsvファイルでいろいろやりたいんですが,...

    すいません。pythonを使いはじめてまだ3日のド素人の意見と思いお付き合いしてください。 pythonで、csvファイルの中にあるカラム10番目の項目にある人数を、1番目のフィールドは項目名なので読みとばして足し合わせいきたいんですが、まだ理解がぜんぜん足りなくて #!/usr/bin/env/python #!coding: utf-8   import sys,string,csv   for line in sys.stdin.readlines(): words = string.split(line, ',')   sum += string.lower(word[10])   print sum と書いて、ファイルを読み込むんですけど、うんともすんとも言わないです。 どなたかアドバイス御願いします。

  • Python Django csv について

    PYthon Django  csv unicod 下記のエラーがでました3時間もやって解決できません、誰かがご教授くだい。 困っています。お願いいたします。 エラー: [u"'\u767b\u9332\u65e5' value has an invalid date format. It must be in YYYY-MM-DD format."] views.py:は以下: def import_csv(request): response = HttpResponse(mimetype='application/vnd.ms-excel; charset=UTF-8') response['Content-Disposition'] = 'attachment; filename=file.csv' reader = csv.reader(response) with open('\Desktop\mkc\Py_meshi\sample.csv', 'r+b') as f: reader = csv.reader(f) for row in reader: tmp = User.objects.create() tmp.UserID = row[0] tmp.user_name = row[1]

  • pythonのエラーについて教えてください。

    pythonの勉強しています。練習として以下の様なコードを書きました。 #!/usr/bin/python # coding=utf-8 f = open('aw1.txt' 'r') for row in f: line_data = row.split(' ') print(line_data(1)) f.close() aw1.txtというファイルは自分でviで作成しました。 このpythonスクリプトを実行すると IOError: [Errno 2] No such file or directory: 'aw1.txtr' というエラーになってしまいます。 でも f = open('aw1.txt' 'r') と書いて なぜ 'aw1.txtr'というファイルがないというエラーとなるのかがわかりません。 どこが間違っているのでしょうか? どなたか教えていただけないでしょうか?

  • Python について質問です

    私はPythonの初心者です。 今Python でCSVのファイルを読んで数値だけ(数値以外に文字列や空白などがあります)を計算処理出来なくて困っています。教えて頂けませんか? 質問は、BB.csvというファイルの数値だけの合計と平均を計算したいです。 私のコードは以下です。 # coding: utf-8 import csv import re import string DATAFILE = 'BB.csv' class UnicodeDictReader(csv.DictReader): def __init__(self, f, fieldnames=None): csv.DictReader.__init__( self, f, fieldnames) def main(): total = 0 all_sum = 0 line_num = 0 with open(DATAFILE) as csvfile: reader = UnicodeDictReader(csvfile) for record in reader: # 値を数値で取得 A = int(record['38186']) B = int(record['38181']) C = int(record['38143']) item_total = A + B + C total = item_total all_sum += item_total line_num += 1 average = all_sum / reader.line_num print(" %d + %d + %d = %d " % ( A, B, C, total)) print(u"合計 %d " % all_sum) print(u"平均 %d " % average) if __name__ == '__main__': main() BB.csvは以下です、 38186,38181,38143 1,1,4 1,1,4 ,, ,, 2020,2020,2020 1412,1412,1412 625,625,625 75,75,75 75,75,75 75,75,75 75,75,75 4,4,4 4,4,4 4,4,4 7828,7828,7828 X,, 0,0,0 0,0,0 ○,, 0,0,0 0,0,0 0,0,0 ,,AAA 0,0,0 0,0,0 0,0,0 ,BBB, 0,0,0 0,0,0 0,0,0 ,, 0,0,0 ,, 0,0,0 0,0,0 ,, 0,0,0 0,0,0 750,750,750 400,400,400 400,400,400 ,, 0,0,0 0,0,0 0,0,0 ,, 0,0,0 0,0,0 0,0,0 0,0,0 0,0,0 0,0,0 0,0,0 6,6,6 6,6,6 18,18,18 18,18,18 18,18,18 18,18,18 18,18,18 16,16,16 16,16,16 6,6,6 6,6,6 18,18,18 18,18,18 18,18,18 18,18,18 18,18,18 11,11,11 11,11,11 11,11,11 3,3,3 3,3,3 3,3,3 3,3,3 4,4,4 4,4,4 3,3,3 3,3,3 16,16,16 16,16,16 16,16,16 14,8,11 8,14,11 8,14,11 8,14,11 8,14,11 8,14,11 8,14,11 8,14,11 8,14,11 15,15,15

  • 漢字の入ったCSVファイルを読み込みたい。

    こんにちは。 python初心者の者です。 漢字の入った.csvファイルからその中の要素をリストに加えていくプログラムを作っています。 しかし、文字コードの問題からか、漢字が表示されず、困っています。 .csvファイルはexcelで作成し、.csv形式で保存しています。 以下にコードを載せるので、ご存知の方ご教授ください。 pythonは2.7 excelは2010を使っております。 【ソースコード】 import csv import codecs filename = raw_input('The file is ...') print 'Reading' + filename + '...' read_file = codecs.open(filename, 'r', 'utf-8') reader = csv.reader(read_file) list1 = [] for line in reader: list1.append(line) print list1 【.csvファイルをメモ帳で開いたイメージ】 小泉 片山 森山 田中 塩川 遠山 坂口 青木 富樫 山田

  • python初心者です。csvファイルを扱いたいんですが...

    すいません、python初心者ですので、気長に聞いてくださいcsvファイルの10番目のカラムの人数を合計したんです。1行目のフィールドはカラム名なので飛ばして2行目から読み込みたいんですが、結果が出てきません。一応書いたプログラムは、 #!usr/bin/env python import sys import string i = 0 for line in open('./data.csv').readlines(): item = string.split(line,',') if item[9].isdigit(): i+=int(item[9]) print i です。処理速度を早くしたいのでdictionaly化せずに行いたいんですが、誰かご教授願えませんか?

  • Django Python csv エラー

    下記のようなエラーでて解決できないです。 Unicodeのエラー? 解決できるやり方がわからなくて困っています。誰かがご教授お願いいたします。 データベースに保存しょうと思ったら不正な文字列値のエラーがでてきました。 ご教授お願いいたします! エラー: (1366, "Incorrect string value: '\\x8E\\x81\\x96\\xBC\\x83J...' for column 'user_name' at row 1") 私のViews.py def import_csv(request): response = HttpResponse(mimetype='application/vnd.ms-excel; charset=UTF-8') response['Content-Disposition'] = 'attachment; filename=file.csv' reader = csv.reader(response) with open('C:\Users\hasichaolu\Desktop\mkc\Py_meshi\sample.csv', 'r+b') as f: reader = csv.reader(f) for row in reader: tmp = User.objects.create() tmp.UserID = row[0] tmp.user_name = row[1] tmp.first_kana = row[2] tmp.save()

  • PYthon Django csv関連

    初めまして、 Python初心者です。 やりかたがわからなくて困っています、誰かがご教授お願い致します。 質問はローカルにExceの内容をデータベースに入れてAdmin作ったアプリに表示したいですがなかなかできなくて困っています。 コード以下です: Views.py def import_csv(request): if request.method == 'POST' and request.FILES.has_key('csv_file'): csv_file = request.FILES['csv_file'] row = [] for row in csv.reader(csv_file): row.append(row.decode('utf-8')) args = {} args.update(csrf(request)) args['row'] = User.objects.all() return render_to_response('importcsv.html',args) importcsv.html {% extends "base.html" %} {% block content %} {% if form.errors %} <p style="color: red;"> Please correct the error{{ form.errors|pluralize }} below. </p> {% endif %} <div> <form action="/import_csv/" method="POST" enctype="multipart/form-data"> {% csrf_token %} {{ form.as_table }} <input type="file" name="csvfile"> <input type="submit" value="import" id="Save"> </form> </div> {% endblock %}

  • csvファイルでpythonを扱いたいんですが

    以下のようなcsvファイルを使って shop,ymd,gend,age,area,amt 20,2008-05-01,3,5,014,128 22,2008-05-01,2,4,015,350 : 二列目の日別、つまりymd別に最後列のamdの小計を出したいんですが、なかなか出てくれません。以下のようなプログラムを組んだんですが #!/usr/bin/env python import csv def readcsv(filename):  L = [line[:-1] for line in file(filename).readlines()]  return map((lambda s: s.split(',')),L) csvlist = readcsv('/data/testdata/journal/j080240.csv') i=0 for line in csvlist[1:]: buydict = dict(zip(csvlist[0],line)) if buydict.itervalues('ymd'): i+=int(buydict['amt']) else: print '%s,%d'% buydict['ymd'],i i=0 とこのように書きました。もう行き詰ってきたので、質問させてもらいました。誰かご教授願えますか?

  • centos python

    以前WindowsでPythonのWebプログラムを書いていました。 webサーバーはapacheを利用しています。 そちらをcentOS(apache)に持って行きたいです。 ↓↓↓↓こちらがwindowsでのスクリプトです #! C:/Python27/python # coding: utf-8 temple_body= u""" <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>Pythonタイトル</title> </head> <body> <h1>Python テンプレート</h1> テンプレートです</br> </body> </html>""" try: print "Content-type: text/html;charset=utf-8\n" print ( temple_body.format() ).encode('utf-8') except Exception as e: print e ただテンプレートと表示されるだけのものです。 この1行目の #! C:/Python27/python を #! /usr/bin/python2.7 と直したところ サイトは開けず 500 Internal Server Error が、 エラーログには以下のようなものが出ていました。 End of script output before headers: index.py AH01215: (13)Permission denied: exec of '/var/www/html/index.py' failed #! /usr/bin/python2.7の部分が問題だと思うのですが どのように直せばいいのかがわかりません。 windowsの時は.exeを探し、Pathを指定しました。 しかし、centosでpython.exeに相当するものがどこにあるのか分りません。 centosの場合どのようなぱすを指定すれば良いのでしょうか?

専門家に質問してみよう