gpt4 book ai didi

python - 使用 Pandas 解析 JSON - 附加\转义字符的问题

转载 作者:太空宇宙 更新时间:2023-11-03 17:28:50 25 4
gpt4 key购买 nike

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

我的问题是转储到 S3 存储桶中的文件对非英语字符使用“八进制转义”格式,但 Python/Pandas 反对 \ 的转义这一事实性格也包括在内。

一个例子是字符串:"destination":"Provence-Alpes-C\\303\\264te d\'Azur"

打印为:

enter image description here

如果我手动删除 \ 之一然后 Python 愉快地解释该字符串并将其打印为:

enter image description here

这里有一些好东西thread尽管.decode('string_escape')在单个片段上效果很好,当它是包含数千条记录的更长字符串的一部分时,它就不起作用了。

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

为了让文件完全正常工作,我使用正则表达式删除了所有 \后跟一个数字:re.sub(r'\\(?=[0-9])', '', g) - 我认为对此进行调整可能是前进的方向,但数字需要是动态的,因为我不知道它会是什么(即,在上面的示例中使用 \3\2 是行不通的去工作')

感谢帮助。

最佳答案

不要让 Python 解释 \ooo 八进制转义符,而是使用正则表达式修复 JSON,然后将其解析为 JSON。我之前在 similar circumstances 中这样做过

您的数据将 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

关于python - 使用 Pandas 解析 JSON - 附加\转义字符的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32204319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com