58

Python 3 プログラムを 2.7 にバックポートしようとしましたが、奇妙な問題が発生しました。

>>> import io
>>> import csv
>>> output = io.StringIO()
>>> output.write("Hello!")            # Fail: io.StringIO expects Unicode
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unicode argument expected, got 'str'
>>> output.write(u"Hello!")           # This works as expected.
6L
>>> writer = csv.writer(output)       # Now let's try this with the csv module:
>>> csvdata = [u"Hello", u"Goodbye"]  # Look ma, all Unicode! (?)
>>> writer.writerow(csvdata)          # Sadly, no.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unicode argument expected, got 'str'

ドキュメントによると、io.StringIO()Unicode テキストのメモリ内ストリームを返します。Unicode 文字列を手動で入力しようとすると、正しく動作します。csv書き込まれているすべての文字列が Unicode 文字列であるにもかかわらず、モジュールと組み合わせて失敗するのはなぜですか? str例外の原因はどこから来るのですか?

(代わりに使用できることは知っていますが、このシナリオでStringIO.StringIO()何が問題なのか疑問に思っています)io.StringIO()

4

5 に答える 5

55

Python 2.7csvモジュールは Unicode 入力をサポートしていません。ドキュメントの冒頭にある注を参照してください。

Unicode 文字列をバイト文字列にエンコードしio.BytesIO、代わりに , を使用する必要があるようですio.StringIO

ドキュメントのUnicodeReaderのセクションには、 aおよびUnicodeWriterラッパー クラスの例が含まれています (ポインターを提供してくれた @AlexeyKachayev に感謝します)。

于 2012-10-29T10:56:37.713 に答える
24

StringIO.StringIO() を使用してください。

http://docs.python.org/library/io.html#io.StringIO

http://docs.python.org/library/stringio.html

io.StringIOクラスです。Unicode を処理します。これは、推奨される Python 3 ライブラリ構造を反映しています。

StringIO.StringIOクラスです。文字列を扱います。これは、従来の Python 2 ライブラリ構造を反映しています。

于 2013-10-08T08:56:05.937 に答える
4

csvドキュメントから:

csvモジュールはUnicodeの読み取りと書き込みを直接サポートしていませんが、ASCIINUL文字に関するいくつかの問題を除いて8ビットクリーンです。したがって、NULを使用するUTF-16のようなエンコーディングを回避する限り、エンコーディングとデコーディングを処理する関数またはクラスを作成できます。UTF-8をお勧めします。

の例はUnicodeReaderUnicodeWriterここhttp://docs.python.org/2/library/csv.htmlにあります。

于 2012-10-29T11:00:55.530 に答える