json.dumps 抛出 UnicodeDecodeError

2 投票
3 回答
9154 浏览
提问于 2025-04-16 06:49

我在一个MS ACCESS的数据表中遇到了未知编码的问题,因为有人从Word文档中复制粘贴文本输入。

所以当我尝试了以下操作:

final_data_to_write = json.dumps(list_of_text_lines) 

结果出现了这个错误:

 "UnicodeDecodeError: 'utf8' codec can't decode byte 0xe1 in position 5: unexpected end of data"

3 个回答

2

从Access转换到Excel时,应该能保留你的数据为Unicode格式。如果所有的Unicode文本都能用你的“ANSI代码页”来编码(可能是cp1252,但别随便猜),那么通过Excel的“另存为CSV”操作不会导致数据混乱。如果不能编码的话,非编码的字符会被替换成?,但这些不会引起你现在的问题。

接下来你可以做的事情:

(1) 找出你的“ANSI代码页”:

在我的电脑上:

command_prompt>\python27\python -c"import locale;print locale.setlocale(locale.LC_ALL,'')"
English_Australia.1252

所以我的代码页是cp1252

(2) 尝试使用json.dumps(myDict, encoding='cpXXXX')

(3) 如果这一步失败了,你需要检查一下你的数据和CSV转JSON的代码,看看是不是哪里搞错了。可以插入一些调试代码,输出包含任何非ASCII字符的行的行号——测试的方法是any(c >= '\x80' for c in line)——然后在文本编辑器中查看这些行,看看它们在你的环境中是否合理。

3

你需要先搞清楚你的数据库使用的是什么字符编码。然后,你需要告诉JSON编码器使用这个编码,这样它才能正确理解字符串。

final_data_to_write = json.dumps(myDict, encoding="XXX")

json模块默认使用的编码是UTF-8。

2

逐行读取文本,然后对每一行进行编码,具体方法如下:

row1 = unicode( list_of_text_line[j] , errors='ignore') 

撰写回答