Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.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 加载带有原始unicode转义编码字符串的JSON_Python - Fatal编程技术网

Python 加载带有原始unicode转义编码字符串的JSON

Python 加载带有原始unicode转义编码字符串的JSON,python,Python,我有一个JSON文件,其中字符串用raw\u unicode\u escape编码(文件本身是UTF-8)。我如何解析它以便字符串在内存中是UTF-8 对于单个属性,我可以使用以下代码,但是JSON非常大,在解析后手动转换每个字符串不是一个选项 #文件“file.json”的内容(“\u00c3\u00a8”是“è”) #{“名称”:“\u00c3\u00a8”} 以open('file.json','r')作为输入: j=json.load(输入) j['name']=j['name']。编码

我有一个JSON文件,其中字符串用
raw\u unicode\u escape
编码(文件本身是UTF-8)。我如何解析它以便字符串在内存中是UTF-8

对于单个属性,我可以使用以下代码,但是JSON非常大,在解析后手动转换每个字符串不是一个选项

#文件“file.json”的内容(“\u00c3\u00a8”是“è”)
#{“名称”:“\u00c3\u00a8”}
以open('file.json','r')作为输入:
j=json.load(输入)
j['name']=j['name']。编码('raw_unicode_escape')。解码('utf-8'))
由于JSON可能非常庞大,因此该方法必须是“增量”的,我无法提前读取整个文件,将其保存在字符串中,然后进行一些处理

最后,我应该注意到,JSON实际上存储在一个zip文件中,所以不是它。

由于
codecs.open('file.JSON','r','raw\u unicode\u escape')
以某种方式工作,我查看了它并提出了一个解决方案

>>从编解码器导入getreader
>>>
>>>以open('file.json','r')作为输入:
...     reader=getreader('raw\u unicode\u escape')(输入)
...     j=json.load(reader.read().encode('raw\u unicode\u escape'))
...     打印(j['name'])
...
è
当然,即使输入是另一种类似文件的对象,比如我的例子中zip存档中的文件,这也会起作用


最后,我拒绝了增量编码器的假设(这对JSON没有意义),但对于那些感兴趣的人,我建议也看看。

您希望您的Python字符串是Python(Unicode)字符串,简单明了。您无法控制Python如何管理其内部内存。这些行是否非常长,是否包含有效的JSON片段?换言之,您是否可以一次处理一行数据,可能需要一些将数据返回到所需格式的规定?只需在
{“name”:“\u00c3\u00a8”}上使用
json.load
就可以很好地解码这些字符。该编码是JSON规范的一部分,将由兼容的JSON解码器解码。“原始Unicode转义”是一种转移注意力的方法,它们不是你的问题。好吧,再说一遍:你的问题不是JSON。您的问题是JSON没有正确编码字符,而您使用的是JSON编码的mojibake,您可以使用您的解决方法来解决这个问题。但真正的解决方案应该是JSON来自哪里。可能吗?你控制编码端吗?或者你至少可以联系那个开发人员,让他们修改编码吗?我同意deceze的观点。如果您可以修复像这样产生垃圾的东西,或者单独预处理文件来修复它,那么您不需要修复读取器。