1

Pythonを使用してmysqlデータベースから一連の文字列を読み取り、いくつかの処理の後、それらをCSVファイルに書き込みます。ただし、csv ファイルに完全に迷惑な文字が表示されます。たとえば、gvim を使用して csv を開くと、、、などの文字が表示されます<92><89><94>

何かご意見は?csv に書き込む前に string.encode('utf-8') を実行しようとしましたが、エラーが発生しましたUnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 905: ordinal not in range(128)

4

4 に答える 4

0

私は最終的にそれを解決しました。MySQLdbpythonモジュールを使用してmysqlに接続していました。私はちょうどそれとデータベース接続を作成している間使用しましたcharset=utf8use_unicode = Trueさらに、MySQLテーブルの照合をに変更しましたutf8_unicode_ci。最後に、文字列をcsvファイルに書き込むときに、次を使用しました。

file_pointer.write(my_string.encode('ascii', 'ignore'))

ロジックがどれほど健全かはわかりませんが、これは数時間のグーグルの後で私が発掘したものであり、それは私にとってはうまくいくようです。

于 2012-07-28T23:55:15.730 に答える
0

これらはvimで修正できます。たとえば、<92> (一重引用符) を処理するには、次のようにします。

:1,$s/CNTRL-V x 92/'/g

したがって、CNTRL、V、x、92 (スペースなし) と入力します。あなたはそれが同じように出てくるのを見るでしょう

:1,$s/<92>/'/g
于 2013-11-20T21:06:08.580 に答える
0

これらの「ジャンク」文字はすべて <80> から <9F> の範囲にありますか? もしそうなら、それらは Microsoft の「スマート クォート」 (Windows-125x エンコーディング) である可能性が高いです。誰かが Word または Outlook でテキストを作成し、それをコピーして Web アプリケーションに貼り付けました。Latin-1 と UTF-8 の両方がこれらの文字を制御文字と見なし、通常、テキスト表示が途切れる (Latin-1) か、?-in-black-diamond-invalid-character (UTF- 8)。

Word と Outlook、およびその他の一部の MS 製品では、クリップボードで使用するテキストの UTF-8 バージョンが提供されていることに注意してください。<80> から <9F> コードの代わりに、スマート クォート文字は適切なマルチバイト UTF-8 シーケンスになります。Web ページが UTF-8 の場合、通常は、Windows-125x エンコーディングのスマート クォートではなく、適切な UTF-8 文字を取得する必要があります。また、これは保証された動作ではありませんが、「かなり一貫して動作するように見える」ことに注意してください。それはすべて、テキストの UTF-8 バージョンが利用可能であり、適切に処理されているかどうかにかかっています (つまり、PC の gvim に貼り付けてから、Web テキスト フォームにコピー/貼り付けしたわけではありません)。これは、UTF-8 でエンコードされたテキストを探している限り、さまざまな PC アプリケーションでも機能する可能性があります。

于 2013-09-04T17:08:41.760 に答える
0

UnicodeDecodeErrorは、バイトをエンコードしようとしていることを意味します。つまり、Python 2 は最初にそれを Unicode にデコードし、次に指定されたエンコーディングを使用してエンコードしようとします。

>>> b"€".encode('utf-8')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: 
ordinal not in range(128)

データがテキスト (画像などの本質的にバイナリ データではない) の場合。Unicode を使用して操作する必要があります。データベース ドライバが Unicode を返さない場合は、バイトを受け取ったらすぐに Unicode に変換してください。

Python 2 の csv モジュールは、バイトでのみ機能します。UnicodeWriterなどから使用して、 Unicode を記述することができます。

于 2012-07-28T23:30:09.667 に答える