作者:北极光的悲伤 | 来源:互联网 | 2023-02-01 23:10
如何解决《python3UnicodeEncodeError:'charmap'编解码器不能编码位置95-98中的字符:字符映射到<undefined>》经验,为你挑选了1个好方法。
一个月前我遇到了这个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
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
有谁知道如何修复此错误消息?
1> Alastair McC..:
这是由于open
Python 3中的默认行为.默认情况下,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*.