Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用json.dumps()时出现UnicodeDecodeError_Python_Json_Python 2.7_Unicode_Character Encoding - Fatal编程技术网

Python 使用json.dumps()时出现UnicodeDecodeError

Python 使用json.dumps()时出现UnicodeDecodeError,python,json,python-2.7,unicode,character-encoding,Python,Json,Python 2.7,Unicode,Character Encoding,我的python列表中有如下字符串(取自命令提示符): 我尝试过这里提到的建议: 进一步将默认编码也更改为utf-16。但是仍然json.dumps()抛出异常,如下所示: >>> write(o) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "okapi_create_master.py", line 49, in write o

我的python列表中有如下字符串(取自命令提示符):

我尝试过这里提到的建议:

进一步将默认编码也更改为utf-16。但是仍然
json.dumps()
抛出异常,如下所示:

>>> write(o)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "okapi_create_master.py", line 49, in write
    o = json.dumps(output)
  File "C:\Python27\lib\json\__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "C:\Python27\lib\json\encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Python27\lib\json\encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe1 in position 25: invalid
continuation byte
写入(o) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 写入文件“okapi_create_master.py”,第49行 o=json.dumps(输出) 文件“C:\Python27\lib\json\\ uuuuu init\uuuuu.py”,第231行,转储 返回默认编码器编码(obj) 文件“C:\Python27\lib\json\encoder.py”,第201行,在encode中 chunks=self.iterencode(o,\u one\u shot=True) 文件“C:\Python27\lib\json\encoder.py”,第264行,在iterencode中 返回_iterencode(o,0) UnicodeDecodeError:“utf8”编解码器无法解码位置25处的字节0xe1:无效 连续字节
无法确定这类字符串需要什么类型的转换才能使
json.dumps()
工作。

\xe1
无法使用utf-8、utf-16编码进行解码

>'\xe1'.解码('utf-8')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Python27\lib\encodings\utf_8.py”,第16行,解码
返回编解码器.utf_8_解码(输入,错误,真)
UnicodeDecodeError:“utf8”编解码器无法对位置0中的字节0xe1进行解码:数据意外结束
>>>“\xe1”。解码('utf-16')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Python27\lib\encodings\utf_16.py”,第16行,解码
返回编解码器.utf_16_解码(输入,错误,真)
UnicodeDecodeError:“utf16”编解码器无法解码位置0中的字节0xe1:截断的数据
尝试拉丁1编码:

>>> record = (5790, 'Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo            ',
...           60, True, '40141613')
>>> json.dumps(record, encoding='latin1')
'[5790, "Vlv-Gate-Assy-Mdl-\\u00e1M1-2-\\u00e19/16-10K-BB Credit Memo            ", 60, true, "40141613"]'
或者,指定
确保_ascii=False
json.dumps
以使
json.dumps
不尝试解码字符串

>>> json.dumps(record, ensure_ascii=False)
'[5790, "Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo            ", 60, true, "40141613"]'

我也遇到了类似的问题,并提出了以下方法来从任意一个输入中保证Unicode或字节字符串。简而言之,以下是lambda:

# guarantee unicode string
_u = lambda t: t.decode('UTF-8', 'replace') if isinstance(t, str) else t
_uu = lambda *tt: tuple(_u(t) for t in tt) 
# guarantee byte string in UTF8 encoding
_u8 = lambda t: t.encode('UTF-8', 'replace') if isinstance(t, unicode) else t
_uu8 = lambda *tt: tuple(_u8(t) for t in tt)
适用于你的问题:

import json
o = (5790, u"Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo            ", 60,
 True, '40141613')
as_json = json.dumps(_uu8(*o))
as_obj = json.loads(as_json)
print "object\n ", o
print "json (type %s)\n %s " % (type(as_json), as_json)
print "object again\n ", as_obj
=>

对象
(5790,u'Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB信用备忘录',60,真实,'40141613')
json(类型)
[5790,“Vlv闸门组件Mdl-\u00e1M1-2-\u00e19/16-10K-BB信用备忘录”,60,正确,“40141613”]
再次反对
[5790,u'Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB信用备忘录',60,正确,u'40141613']

还有一些。

使用
确保\u ascii=False来删除错误的最快方法。另请参见:
import json
o = (5790, u"Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo            ", 60,
 True, '40141613')
as_json = json.dumps(_uu8(*o))
as_obj = json.loads(as_json)
print "object\n ", o
print "json (type %s)\n %s " % (type(as_json), as_json)
print "object again\n ", as_obj
object
  (5790, u'Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo            ', 60, True, '40141613')
json (type <type 'str'>)
  [5790, "Vlv-Gate-Assy-Mdl-\u00e1M1-2-\u00e19/16-10K-BB Credit Memo            ", 60, true, "40141613"]
object again
  [5790, u'Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo            ', 60, True, u'40141613']