2017-06-06 43 views
1

一個月前,我遇到了這個Github上:https://github.com/taraslayshchuk/es2csvpython3 UnicodeEncodeError:「字符映射」編解碼器不能在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)) 

但是一個月後,有必要讓es2csv包在Windows 10操作系統上工作。的Windows 10下做與es2csv完全相同的調整之後,我收到以下錯誤消息後,我試圖運行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上,它將使用8位字符集(例如windows-1252)來匹配記事本的行爲。

由於8位字符集只有有限的字符數,所以最終很難寫出字符集不支持的字符。例如,如果您嘗試使用Windows-1252(西歐字符集)編寫希伯來字符。

要解決你的問題,你只需要覆蓋的自動編碼選擇在open和硬編碼使用UTF-8:

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

這並不是每次 –

+3

@SitzBlogz是它的工作。 「沒有證據可以斷言的東西可以在沒有證據的情況下被駁回」 - *克里斯托弗希欽斯*。 –

相關問題