
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でデータベースを作る前のこの段階で躓いて、全然前に進めずにいます(>_<)
どうか教えて下さい、宜しくお願いします。
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に対応させる方法等が見つかるので、それを使いましょう
この回答への補足
お礼と補足を入力したつもりだったのですが、反映されておらず、遅くなって申し訳ありません。
丁寧にご回答頂いてありがとうございます。よく分かりました。
文字化けについてはその通り(\xe5\…という状態)で、正常な動作だと分かり安心しました。
それで、教えて頂いた書き方を試したのですが、今度は、英語は表示されますが日本語は�h�A�p�l という感じになってしまいます。
これは、どの文字コードで表示されている事になるのでしょうか…?
unicodeへの対応、試してみます。
それから、python3にすればこの問題は起きない、という理解で正しいですか?
そうだとすれば、これから学習するので3系にしようかな、とも思い始めました…。
再度の質問で申し訳ありませんが、アドバイス頂ければ幸いです。
ありがとうございます。
No.2
- 回答日時:
str文字列を使う場合、printすれば、変換等無しに、そのまま、ターミナルに出力されます。
cat test.csv
と、CSVファイルをそのまま端末に出力したら、同じ文字化けするのでは?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Sikulix2.0.5(Jython2.7.3)でcsvを読込WEB検索条件にpasteで文字化け 1 2023/03/31 11:02
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- その他(プログラミング・Web制作) pythonのpandasのcsvの外部結合(outer_join)した際に列が想定とは異なる事象 1 2022/05/25 13:23
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでcsvファイルもシートもあ...
-
ダブルコーテーション付きでCSV...
-
【ExcelVBA】300万件越えCSVか...
-
バッチファイルで複数のディレ...
-
VB.netでShellExecuteがしたい
-
Excelマクロ 空白セルを無視し...
-
CSVで余計な空行が入る
-
LibreOffice Calcのマクロで、...
-
マクロで使うfor文
-
文字列の結合がうまくいかない
-
エクセルの任意のシートをcs...
-
【C#】 csvファイルをバイナリ...
-
Sikulix2.0.5(Jython2.7.3)でcs...
-
VBAで複数のCSVからレコードセ...
-
ファイル名を変数で書きこむfwr...
-
CSVファイルの比較と結果の取得...
-
バッチ処理 特定の文字以降を...
-
[Excel VBA] 入力された値に応じて
-
フォーム間でtxtbox値の渡しで...
-
型の値をDataGridViewセルに変換...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでcsvファイルもシートもあ...
-
Excelマクロ 空白セルを無視し...
-
【ExcelVBA】300万件越えCSVか...
-
ダブルコーテーション付きでCSV...
-
ファイル名を変数で書きこむfwr...
-
VBAで複数のCSVからレコードセ...
-
CSVデータの文字列置換
-
複数のファイルをまたぐエクセ...
-
CSVファイルの比較と結果の取得...
-
【C#】 csvファイルをバイナリ...
-
PowerShellからGhostscriptを動...
-
EXCEL→CSV保存時のダブルクォー...
-
VB.NETでオブジェクトの内容を...
-
パイソン文法で ファイルオープ...
-
VB.netでShellExecuteがしたい
-
PowerShellでファイルの連結方法
-
Rubyを使用してcsvファイルを処...
-
rubyを用いたCSVファイルの分割...
-
バッチファイルでcsvファイルに...
-
エクセルの任意のシートをcs...
おすすめ情報