繁体   English   中英

使用Pandas解析JSON-带有其他\\转义字符的问题

[英]Parsing JSON using Pandas - issue with additional \ escape characters

我正在从S3下载包含JSON(例如)数据的文件,我打算使用pd.read_json将其解析为Pandas数据pd.read_json

我的问题是,转储到S3存储桶中的文件对非英语字符使用“八进制转义”格式,但是Python / Pandas对象也包含\\字符的转义。

例如字符串: "destination":"Provence-Alpes-C\\\\303\\\\264te d\\'Azur"

打印为:

在此处输入图片说明

如果我手动删除\\字符之一,那么Python会很高兴地解释该字符串,并显示为:

在此处输入图片说明

线程中有一些不错的东西,尽管.decode('string_escape')在单个代码片段上效果很好,但是当它在更长的字符串中包含成千上万条记录时,它就无法工作。

我相信我需要一种巧妙的方法来用\\替换\\\\ ,但是出于有据可查的原因, .replace('\\\\', '\\')不起作用。

为了使文件全部正常工作,我使用了一个正则表达式删除所有\\后跟一个数字: re.sub(r'\\\\(?=[0-9])', '', g) -I'我认为可能是适应这种情况的方法,但是这个数字必须是动态的,因为我不知道它将是什么(即,在上面的示例中使用\\3\\2无效)

帮助表示赞赏。

与其让Python解释\\ooo八进制转义符,不如使用正则表达式修复JSON,然后将其解析为JSON。 我以前在类似情况下是这样做的

您的数据的UTF-8字节转义为八进制\\ooo序列,因此,您在这里查找值的更有限范围:

import re

invalid_escape = re.compile(r'\\([1-3][0-7]{2}|[1-7][0-7]?)')  # octal digits from 1 up to FF
def replace_with_codepoint(match):
    return chr(int(match.group(0)[1:], 8))

def repair(brokenjson):
    return invalid_escape.sub(replace_with_codepoint, brokenjson)

演示:

>>> import json
>>> sample = '{"destination":"Provence-Alpes-C\\303\\264te d\'Azur"}'
>>> repair(sample)
'{"destination":"Provence-Alpes-C\xc3\xb4te d\'Azur"}'
>>> json.loads(repair(sample))
{u'destination': u"Provence-Alpes-C\xf4te d'Azur"}
>>> print json.loads(repair(sample))['destination']
Provence-Alpes-Côte d'Azur

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM