如何在Python中编写JSON时修复重复值

时间:2019-05-28 18:35:17

标签: python json

我有两个文件,读取两个文件后,我将其写入python中的json文件中。问题出在最终的json文件中,我正在获取重复的json对象(附加了最后的json对象)。

我能够读取文件并生成json文件。

import json

data2 = {}
data1 = []
i = 1

with open('abc3') as json_file:
    f=open("abc2", "r")
    data = json.load(json_file)
    lines =f.readlines()
    for p,x in zip(data['Url'],lines):
        print(p['Urls'])
        print(x)
        print(i)
        print('')
        data2['videoId'] = i
        data2['videoUrl'] = p['Urls']
        data2['videName'] = x
        i = i + 1   
        data1.extend(data2)



with open('data1.json', 'w') as outfile:
    json.dump(data1, outfile)

1 个答案:

答案 0 :(得分:1)

重用data2的相同引用是主要问题。在每次迭代时创建一个字典。

如果您要创建字典列表,则如果执行data1.extend(data2),则extend会在字典的上进行迭代。

快速修复:

for p,x in zip(data['Url'],lines):
    print(p['Urls'])
    print(x)
    print(i)
    print('')
    data2 = {}
    data2['videoId'] = i
    data2['videoUrl'] = p['Urls']
    data2['videName'] = x
    i = i + 1   
    data1.append(data2)

但是列表理解会更清晰和更pythonic(注意:不要读取行,直接使用f,这将避免读取无用的文件):

data1 = [{"videoId":i,"videoUrl":p['Urls'],'videoName':x.rstrip()}
          for i,(p,x) in enumerate(zip(data['Url'],f),1)]

这将在每次迭代中创建一个字典。 i的副作用被enumerate(从1开始)的使用所代替。请注意,rstrip()操作需要在逐行读取文件时删除行尾字符。

总结起来,这是我重写完整代码的方法:

import json

with open('abc3') as json_file:
    data = json.load(json_file)

with open("abc2") as f:
    data1 = [{"videoId":i,"videoUrl":p['Urls'],'videoName':x.rstrip()}
              for i,(p,x) in enumerate(zip(data['Url'],f),1)]

with open('data1.json', 'w') as outfile:
    json.dump(data1, outfile)