【问题标题】:Line character replacement while opening json file with python用python打开json文件时换行符
【发布时间】:2018-10-22 04:18:12
【问题描述】:

我有一个 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?

【问题讨论】:

  • 有 pandas.read_json()
  • 我知道。已经尝试过了,但它不起作用。 ValueError:解码对象值时发现意外字符
  • 这看起来和昨天的问题一样。为什么要重复?
  • 我昨天写错了关于文件的信息。
  • 文件大吗? (我的意思是文件大小)。例如,您可以将其粘贴、保存并分享到jsfiddle.net 吗?如果是这样,我想也许我可以在代码编辑器中使用搜索替换 + 一些 javascript 轻松修复它。但是我不知道一个好的正则表达式来解决它,我只会使用我在上一个问题中提到的方法。

标签: regex python-2.7 pandas


【解决方案1】:

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

我可以提供一个两步解决方案,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 文件。

【讨论】:

    猜你喜欢
    • 2014-03-10
    • 2017-10-30
    • 2016-07-20
    • 2020-11-16
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2020-08-06
    • 2018-08-07
    相关资源
    最近更新 更多