Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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忽略非ascii字符UnicodeDecodeError:';ascii';编解码器不能解码字节_Python_Json_Python 2.7_Encoding_Utf 8 - Fatal编程技术网

Python json忽略非ascii字符UnicodeDecodeError:';ascii';编解码器不能解码字节

Python json忽略非ascii字符UnicodeDecodeError:';ascii';编解码器不能解码字节,python,json,python-2.7,encoding,utf-8,Python,Json,Python 2.7,Encoding,Utf 8,Python 2.7.3 我已经阅读了关于json/dumps UnicodeDecodeError的所有相关线程,其中大多数都希望我了解我需要什么编码。在我的例子中,我创建了一个json,其中包含来自各种服务(一些p4命令行)的各种键值,可能是不同的编码。我有一张这样的地图 map = {"system1": some_data_from_system1, "system2", some_data_from_system2} json.dumps(map) 这会抛出一个“UnicodeDec

Python 2.7.3

我已经阅读了关于json/dumps UnicodeDecodeError的所有相关线程,其中大多数都希望我了解我需要什么编码。在我的例子中,我创建了一个json,其中包含来自各种服务(一些p4命令行)的各种键值,可能是不同的编码。我有一张这样的地图

map = {"system1": some_data_from_system1, "system2", some_data_from_system2}
json.dumps(map)
这会抛出一个“UnicodeDecodeError:'ascii'编解码器无法对737位置的字节0x92进行解码:序号不在范围内(128)”

我希望将ASCII字符转储到一个文件中,有时p4签入/jira可能有非ASCII字符,完全可以忽略这一点。我尝试过“确保ascii=False”,但它并没有解决问题。我真正想要的是编码器简单地忽略任何非ascii字符。我认为这是合理的,但找不到任何出路

建议?

默认情况下,
json.dumps()
json.dump()
函数在传入时将尝试使用UTF-8将字节字符串解码为Unicode值:

>>> map = {"system1": '\x92'}
>>> json.dumps(map)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/__init__.py", line 243, in dumps
    return _default_encoder.encode(obj)
  File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 0: invalid start byte
>>> map = {"system1": u'\x92'.encode('utf8')}
>>> json.dumps(map)
'{"system1": "\\u0092"}'
这将强制解码字符串,用替换字符替换任何未识别为ASCII码点的字节:

>>> '\x92'.decode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x92 in position 0: ordinal not in range(128)
>>> '\x92'.decode('ascii', errors='replace')
u'\ufffd'
>'\x92'.解码('ascii')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
UnicodeDecodeError:“ascii”编解码器无法解码位置0中的字节0x92:序号不在范围内(128)
>>>“\x92”。解码('ascii',错误='replace')
u'\ufffd'

这里插入一个代码点来表示未知的代码点。您也可以使用
errors='ignore'

完全忽略这些字节。我使用了和上面的答案的组合来完成这段日志记录

如上所述,来自_系统{1 | 2}的一些_数据_不是字符串。问题是关于一个通用的错误记录系统。当出现问题时,您希望从多个子系统中转储尽可能多的信息,以供人工检查。子系统在不同的环境中变化,当它们返回表示出错/出错的“JSON”时,并不总是知道这些子系统使用什么编码。为此,我从另一个线程窃取了以下方法,但本质上是带有“ignore”的
decode
方法

请注意:这不是一种非常有效的方法(大多数盲递归通常不是)。因此,这不适用于典型的生产应用;根据数据的不同,它可能会运行到一个无限循环中。但是,假设您理解免责声明,那么错误日志记录系统也可以

def convert_encoding(data, encoding = 'ascii'):
    if isinstance(data, dict):
        return dict((convert_encoding(key), convert_encoding(value)) \
             for key, value in data.iteritems())
    elif isinstance(data, list):
        return [convert_encoding(element) for element in data]
    elif isinstance(data, unicode):
        return data.encode(encoding, 'ignore')
    else:
        return data

map = {"system1": some_data_from_system1, "system2", some_data_from_system2}
json.dumps(convert_encoding(map), ensure_ascii = False)

完成后,此通用方法可用于转储数据。

如果json格式的字符串具有非ASCII字符,则需要相应地使用python的转储方法:

myString = "{key: 'Brazilian Portuguese has many differenct characters like  maçã (apple) or Bíblia (Blible)' }" # or a map
myJSON = json.dumps(myString, encoding="latin-1") #use utf8 if appropriate
myJSON = json.loads(myJSON)

请务必包括可复制的样品;这里的
some\u data\u来自\u system1
some\u data\u来自\u system2
的值是什么?异常的完整回溯是什么?对不起,数据有什么关系?这些可能是不同的编码,对于一个通用的记录器来说应该无关紧要。其目的是将尽可能多的数据转储到一个文件中供人们阅读(以便以后调试)。问题是所显示的代码不会引发该异常;例如,它会抛出一个关于最多不能解码UTF-8的异常。如果有一个实际的例子显示您在匹配异常方面的问题,那么我们就可以更清楚地了解您在这里试图做什么。您在这里已经包括了一些暗中刺伤,但是您不关心非ASCII代码点是否丢失的事实并不清楚,例如,为什么不清楚?这是一个python错误记录系统。当事件发生时(可能是异常或其他情况),它只需从子系统获取一些输入“通常是json字符串”,并发送一封包含输出的电子邮件。如果因为数据可能包含用户请求的描述而丢失非ASCII代码点,这没关系,这也没关系!我想倾尽我所能,供以后阅读。我仍然认为这是一个合理和有效的要求。
myString = "{key: 'Brazilian Portuguese has many differenct characters like  maçã (apple) or Bíblia (Blible)' }" # or a map
myJSON = json.dumps(myString, encoding="latin-1") #use utf8 if appropriate
myJSON = json.loads(myJSON)