Python3 UnicodeEncodeError: 'charmap'编解码器无法编码第95-98位字符: 字符映射到<undefined>。

7
一个月前,我遇到了这个Github:https://github.com/taraslayshchuk/es2csv。 我在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软件包正常工作。在进行与Windows 7相同的调整后,尝试运行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>

有人知道如何修复这个错误消息吗?

这个回答解决了您的问题吗?[UnicodeEncodeError:'charmap'编解码器无法编码字符](https://dev59.com/Zl4d5IYBdhLWcg3wLf4g) - anthony sottile
1个回答

32
这是因为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'):

9
是的,它确实可以。 "没有证据支持的论断可以被无证据地驳回" - Christopher Hitchens。 - Alastair McCormack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接