首页 > 解决方案 > 用python打开json文件时换行符

问题描述

我有一个 json 文件,在某些行我发现

{"fruit": "C", "opinion": "too bitter", "country": "X"},
{"fruit": "D", "opinion": "too bitter but "sometimes" sweet", "country": "Y"},
{"fruit": "A", "opinion": "salt "and" ok", "country": "Z"},

如何自动化以下代码?

with open("fruits.json", "rt") as f:
    with open("fruit_f.json", "wt") as f2:
        for i in f:
            f2.write(i.replace('"sometimes"', 'sometimes'))

我的问题是“”中的字符串(或数字)可以更改,我无法跟踪它们中的每一个,因为它是一个巨大的文件。是否可以使用 re.sub ?如果无法以 json 格式打开,有没有办法将其转换为 pandas df?

标签: regexpython-2.7pandas

解决方案


这是一个难题,我想不出银弹可以用正则表达式一次性解决这个问题,因为这是一个嵌套模式,在递归结构中有多个可能的锚点。

我可以提供的是一个两步解决方案,a)尝试查找用双引号括起来的所有数据值,b)如果有的话,替换未转义的引号:

import regex as re    
regex = r"(?<=\": \").*?(?=\"\s*[,}])"
input_str = ("{\"fruit\": \"C\", \"opinion\": \"too bitter\", \"country\": \"X\"},\n"
    "{\"fruit\": \"D\", \"opinion\": \"too bitter but \"sometimes\" sweet\", \"country\": \"Y\"},\n"
    "{\"fruit\": \"A\", \"opinion\": \"salt \"and\" ok\", \"country\": \"Z\"},")

matches = re.finditer(regex, test_str, re.MULTILINE | re.UNICODE)

for matchNum, match in enumerate(matches):
    matchNum = matchNum + 1
    ##print(match.group().replace('"', '\"'))
    if "\"" in match.group():
        input_str = input_str.replace(match.group(), match.group().replace("\"", "\\\""))

如您所见,如果存在未转义的引号,则替换将应用于 input_string。

输出:print(input_str)

{"fruit": "C", "opinion": "too bitter", "country": "X"},
{"fruit": "D", "opinion": "too bitter but \"sometimes\" sweet", "country": "Y"},
{"fruit": "A", "opinion": "salt \"and\" ok", "country": "Z"},

最后,您应该得到一个有效的 JSON 文件。


推荐阅读