web-dev-qa-db-ja.com

Python CSVモジュールを使用してBOMでUTF-8を読み取ると、不要な余分な文字が発生します

次のコードでPythonを使用してCSVファイルを読み取ろうとしています:

with open("example.txt") as f:
   c = csv.reader(f)
   for row in c:
      print row

ぼくの example.txtには次のコンテンツのみが含まれます。

こんにちは世界!

UTF-8またはANSIでエンコードされたファイルの場合、これにより期待される出力が得られます。

> ["Hello world!"]

しかし、ファイルをBOMを使用してUTF-8として保存すると、次の出力が得られます。

> ["\xef\xbb\xbfHello world!"]

ユーザーが入力として使用するファイルを制御できないため、これをBOMでも機能させたいと思います。この問題を解決するにはどうすればよいですか?これが他のエンコーディングでも機能することを確認するために必要なことはありますか?

12
Anders

unicodecsv Pythonモジュールは次のように使用できます:

import unicodecsv

with open('input.csv', 'rb') as f_input:
    csv_reader = unicodecsv.reader(f_input, encoding='utf-8-sig')
    print list(csv_reader)

したがって、BOMを使用したUTF-8で以下を含む入力ファイルの場合:

c1,c2,c3,c4,c5,c6,c7,c8
1,2,3,4,5,6,7,8

次のように表示されます。

[[u'c1', u'c2', u'c3', u'c4', u'c5', u'c6', u'c7', u'c8'], [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8']]

unicodecsvモジュールは、次のようにpipを使用してインストールできます。

pip install unicodecsv
6
Martin Evans