【问题标题】:Using python to modify format of Json file使用python修改Json文件格式
【发布时间】:2016-03-14 17:18:11
【问题描述】:

我的 JSON 文件格式如下: (为清楚起见多行)

(第 0001 行).......

{
    "_id": "iD_0001",
    "skills": [{
        "name": "Project Management"
    }, {
        "name": "Business Development"
    }]
}

.... (第 9999 行)

{
    "_id":"iD_9999",
    "skills": [{
        "name": "Negotiation"
    }, {
        "name": "Banking"
    }]
}

我想在上面运行一个程序,但是程序在上述格式下无法读取它。 因此,我想将其格式修改为:

[{
    "_id": "iD_0001",
    "skills": [{
        "name": "Project Management"
    }, {
        "name": "Business Development"
    }]
},{
    "_id":"iD_9999",
    "skills": [{
        "name": "Negotiation"
    }, {
        "name": "Banking"
    }]
}]

本质上,将所有条目放在一个数组中。 有没有办法使用 Python 或 demjson 来实现?

替代方案:我制作了一个程序,用于获取这些 json 文件中的技能并将它们发送到文本文件 (Test.txt),但它仅适用于第二种格式,而不适用于第一种格式。您能否建议进行修改以使其适用于第一种格式(上图)? 这是我的程序:

import json
from pprint import pprint
with open('Sample.json') as data_file:    
    data = json.load(data_file)

    with  open('Test.txt', 'w') as f:
        for x in data:
            for y in x["skills"]: 
                    f.write(y["name"])
        f.close()

解决方案

感谢 Antti Haapala 注意到第一种格式下 Json 对象的串联,以及 Walter Witzel 和 Josh J 提出的替代答案。 由于第一种格式是单个对象的串联,因此如果我们逐行加载第一个 Json 文件而不是作为一个整体,程序运行良好。我已经做到了:

data = []
with open('Sample1-candidats.json') as data_file:    
for line in data_file:
    data.append(json.loads(line))

    with  open('Test.txt', 'w') as f:
        for x in data:
            for y in x["skills"]: 
                    f.write(y["name"])
        f.close()

【问题讨论】:

  • 第一个不是单个 JSON 文件。 json.load 一次只从文件中加载一个对象。第一个是多个 JSON 对象的串联。
  • 在您的示例文件中,每条记录之间是否有文字 ..... 或者您是否使用它作为示例来缩短复制/粘贴?
  • ..... 是为了缩短复制粘贴。不是字面意思
  • 只有一个小观察:您的解决方案假定您没有在您的问题上共享的信息(事实上您每行有一个 json 对象)。您呈现 json 示例的方式,我们假设您有 \n 个字符打破了行。

标签: python arrays json python-import


【解决方案1】:

来了。这假设您的文件只是一堆连接在一起的单个 json 对象,您需要在 json 对象列表中进行转换。

import json
from pprint import pprint

with open('sample.json') as data_file:    
    strData = '[' + ''.join(data_file.readlines()).replace('}\n{','},{') + ']'
    data = eval(strData)

with  open('Test.txt', 'w') as f:
    for x in data:
        for y in x["skills"]: 
            f.write(y["name"])

【讨论】:

  • 我在上面评论中引用的解决方案更好,但这也可以。
【解决方案2】:

您可以采取以下步骤来解决您的问题。因为这听起来有点像家庭作业,所以我会给你逻辑和指针,而不是代码。

  1. 打开文件进行阅读
  2. 将文件读入字符串变量(如果内存限制足够小)
  3. 为输出创建空的list
  4. ..... 上拆分字符串
  5. json.loads每条结果列表
  6. 将每个结果附加到您的空输出列表中
  7. 喝杯咖啡庆祝一下

【讨论】:

  • 很遗憾,这不是家庭作业,文件可能会变得太大而无法满足内存限制。不过我明白你的推理了,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 2014-01-28
  • 1970-01-01
相关资源
最近更新 更多