【问题标题】:python3 UnicodeEncodeError: 'charmap' codec can't encode characters in position 95-98: character maps to <undefined>python3 UnicodeEncodeError:'charmap'编解码器无法编码位置 95-98 中的字符:字符映射到 <undefined>
【发布时间】:2017-11-07 13:38:50
【问题描述】:

一个月前我遇到了这个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))

但一个月后,必须让 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>

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

【问题讨论】:

标签: python-3.x elasticsearch-plugin python-unicode


【解决方案1】:

这是由于 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'):

【讨论】:

  • @SitzBlogz 是的。 “没有证据就可以断言的东西可以在没有证据的情况下被驳回” - Christopher Hitchens
猜你喜欢
  • 1970-01-01
  • 2018-07-30
  • 2021-01-27
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 2018-09-15
  • 2015-11-29
相关资源
最近更新 更多