2017-06-06 9 views
1

にマップヶ月前、私はこのGithubのに遭遇しました:https://github.com/taraslayshchuk/es2csvのpython3 UnicodeEncodeErrorを「のcharmap」コーデックは位置95-98で文字をエンコードすることはできません:文字が<undefined>

私は、LinuxのUbuntuでPIP3を経由して、このパッケージをインストールしました。このパッケージを使用したいとき、このパッケージがpython2用であるという問題が発生しました。私はコードに飛び込んですぐに問題を見つけました。

   for line in open(self.tmp_file, 'r'): 
       timer += 1 
       bar.update(timer) 
       line_as_dict = json.loads(line) 
       line_dict_utf8 = {k: v.encode('utf8') if isinstance(v, unicode) else v for k, v in line_as_dict.items()} 
       csv_writer.writerow(line_dict_utf8) 
      output_file.close() 
      bar.finish() 
     else: 
      print('There is no docs with selected field(s): %s.' % ','.join(self.opts.fields)) 

コードはそのため、私は以下のコードにコードを変更Unicodeのチェックは、これはのpython3内の必要はありませんでした。その結果、パッケージは、Ubuntuの16

   for line in open(self.tmp_file, 'r'): 
       timer += 1 
       bar.update(timer) 
       line_as_dict = json.loads(line) 
       # line_dict_utf8 = {k: v.encode('utf8') if isinstance(v, unicode) else v for k, v in line_as_dict.items()} 
       csv_writer.writerow(line_as_dict) 
      output_file.close() 
      bar.finish() 
     else: 
      print('There is no docs with selected field(s): %s.' % ','.join(self.opts.fields)) 

の下で適切に働いていた。しかしヶ月後、Windows 10オペレーティングシステム上で作業es2csvパッケージを取得する必要がありました。私はes2csvを実行しようとした後にWindows 10の下es2csvとまったく同じ調整を行った後、私は次のエラーメッセージを受信:

PS C:\> es2csv -u 192.168.230.151:9200 -i scrapy -o database.csv -q '*' 
Found 218 results 
Run query [#######################################################################################################################] [218/218] [100%] [0:00:00] [Time: 0:00:00] [ 2.3 Kidocs/s] 
Write to csv [#                              ] [2/218] [ 0%] [0:00:00] [ETA: 0:00:00] [ 3.9 Kilines/s]T 
raceback (most recent call last): 
    File "C:\Users\admin\AppData\Local\Programs\Python\Python36\Scripts\es2csv-script.py", line 11, in <module> 
    load_entry_point('es2csv==5.2.1', 'console_scripts', 'es2csv')() 
    File "c:\users\admin\appdata\local\programs\python\python36\lib\site-packages\es2csv.py", line 284, in main 
    es.write_to_csv() 
    File "c:\users\admin\appdata\local\programs\python\python36\lib\site-packages\es2csv.py", line 238, in write_to_csv 
    csv_writer.writerow(line_as_dict) 
    File "c:\users\admin\appdata\local\programs\python\python36\lib\csv.py", line 155, in writerow 
    return self.writer.writerow(self._dict_to_list(rowdict)) 
    File "c:\users\admin\appdata\local\programs\python\python36\lib\encodings\cp1252.py", line 19, in encode 
    return codecs.charmap_encode(input,self.errors,encoding_table)[0] 
UnicodeEncodeError: 'charmap' codec can't encode characters in position 95-98: character maps to <undefined> 

は、誰もがこのエラーメッセージを解決する方法のアイデアを持っていますか?

答えて

3

これはPython 3のopenのデフォルトの動作によるものです。デフォルトでは、Python 3はファイルをテキストモードで開きます。つまり、すべてのファイルに対してutf-8やASCIIなどのテキストデコードを適用する必要があります。それは読む文字です。

Pythonはロケールを使用して、最適なエンコーディングを決定します。 OS XとLinuxでは、通常はUTF-8です。 Windowsでは、メモ帳の動作に合わせてwindows-1252などの8ビット文字セットを使用します。

8ビット文字セットの文字数が限られているため、文字セットでサポートされていない文字を書き込もうとすると非常に簡単です。たとえば、Windows-1252でヘブライ文字を書こうとすると、西ヨーロッパの文字セットが返されます。

あなたの問題を解決するには、あなたは、単にopenに自動エンコードの選択を無効にし、UTF-8を使用するようにハードコーディングする必要があります。

for line in open(self.tmp_file, 'r', encoding='utf-8'): 
+0

このたび –

+3

に動作しません@SitzBlogzはい、それはありません。 "証拠なしで主張できるものは、証拠なしでは却下することができる" - * Christopher Hitchens *。 –

関連する問題