2016-10-25 6 views
8

MySQLデータベースからエクスポートされたcsvファイルを受信しました(言語がスペイン語であるため、エンコーディングはlatin1です)。残念ながら、エンコーディングは間違っており、処理できません。私は、ファイルを使用する場合:Python MySQL CSVがjsonの奇妙なエンコーディングにエクスポートする

r.decode('latin-1').encode("utf-8")

またはmysql_latin1_codec使用:

$ file -I file.csv file.csv: text/plain; charset=unknown-8bit

を私はPythonでファイルを読み込むと同様にUTF-8に変換しようとしています

r.decode('mysql_latin1').encode('UTF-8')

私は試していますgを使用してデータをjsonオブジェクトに変換します。

「UnicodeEncodeErrorを:: 『ASCII』コーデックが所定の位置に文字をエンコードすることはできません」

あなたは、私は通常のUTF-8文字に変換する方法を知っていますかエラーが、私は、ファイルを保存するときに来ますか?または、データを有効なjsonに変換するにはどうすればよいですか?ありがとう!!

+1

デコードしようとしているものの例を挙げることができますが、エラーだけで問題を再現して解決策を見つけるのは容易ではありません... – coder

+0

確かに、csvフィールドには次のように表示されます。 DIRECCI NBARCELONA、v lidahastaなど – alexsc

答えて

1

私はContinuum Analyticsのpandasデータフレームを使用して本当に良い結果を得ました。あなたができるその後

import pandas as pd 
from pandas import * 

con='Your database connection credentials user, password, host, database to use' 
data=pd.read_sql_query('SELECT * FROM YOUR TABLE',conn=con) 

あなたのような何かをcoud

data.to_csv('path_with_file_name') 

のか、JSONに変換する:

data.to_json(orient='records') 

をか、あなたのJSONをカスタマイズしたい場合フォーマットはこちらのドキュメントをご覧ください: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_json.html

+0

こんにちはBeatriz、私はcsvを開くためにパンダを使用し、force_ascii = Trueを使用してjsonに展開しました – alexsc

0

を使用すると、コーデックモジュールを使用してみましたが?:

import codecs 
.... 
codecs.EncodedFile(r, 'latin1').reader.read() 

私はしばらく前に同様の問題を持つと答えはエンコーディングが前のPython 3コーデックに行われていた方法とは何かを扱うように思われた覚えていますこの問題は比較的エレガントに起こります。

質問のコメントに記載されているコーダーは、それを再現できないと問題を特定するのが難しいので、間違ったツリーを吠えているかもしれません。

+0

私はそれと他のものもうまくいきました、成功しませんでした:(ありがとう! – alexsc

0

おそらく2つの問題があります。しかし、元に戻しましょう...テキストが間違ってインポートされたのか、間違って書き出されたのか、単にばかげた方法で表示されたのかはわかりません。

まず、私は、「インポート」について議論するつもりです...

は、エンコーディングを変更しようとしないでください。代わりにエンコーディングで生きてください。しかし、まず、エンコーディングが何であるか把握してください。それはlatin1でもutf8でもかまいません。 (または、そうでない可能性の高い文字セットの多く)。

受信ファイルの16進数を調べます。

for i, c in enumerate(u): 
    print i, '%04x' % ord(c), unicodedata.category(c), 
    print unicodedata.name(c) 

あなたが一緒にUTF8の六角で、すべてのlatin1の文字に対する進値のリストを表示するにはhereを行くことができます:Pythonでは、コードは、文字列u用の六角(など)をダンプするために、このようなものです。たとえば、óはlatin1 F3またはutf8 C2B3です。

今、エンコーディングを知っていることを前提に、MySQLに伝えてください。

LOAD DATA INFILE ... 
    ... 
    CHARACTER SET utf8 -- or latin1 
    ...; 

一方、なるように定義されているものテーブルまたはCHARACTER SET ...問題ではありません。 mysqlは必要に応じてトランスコードします。スペイン語の文字はすべてlatin1とutf8で使用できます。

this Q&Aにアクセスしてください。

私は、2つのエラーがあることを示唆しました.1つは「ブラックダイヤモンド」のケースです。他にも何かがあります。しかし...言及した "ベストプラクティス"に従ってください。

戻る「エクスポート」のあなたの質問に...再び

は、出力ファイルの六角をチェックする必要があります。ここでもlatin1かutf8かは関係ありません。ただし、単純にóの場合、16進数がC383C2B3の場合は、「二重エンコード」となります。もしあなたがそれを持っていれば、あなたは手動の変換関数呼び出しを削除したことを確認し、単にMySQLに何を伝えてください。

ここではさらに必要な場合がありますutf8+Python tipsです。

さらにヘルプが必要な場合は、テキストをステップバイステップで実行してください。各ステップで移動/変換するためのコードを表示し、各ステップで16進数を表示します。

+0

こんにちはリックとあなたの素晴らしい説明に感謝します。私はあなたのヒントを知っています、残念ながら、私はMySQLにアクセスすることはできません。私は間違って既にエクスポートされたいくつかのcsvファイルに制限されています:(。 – alexsc

+0

ファイルの16進数をPythonで検出できますか?おそらく "バイナリ" 16進数ですか?(私はPythonを話さないので、特定のコードを手助けすることはできません) –

+0

このような意味がありますか?\ x89 \ xe3 \ xa2? – alexsc

関連する問題