将所有对象从Python中的JSON文件读入列表

时间:2016-03-24 23:51:03

标签: json python-3.x

我可能在这里犯了很多错误。对python和JSON来说很新。 我有多个“歌曲”-JSON对象。我需要从文件中写入和读取。 JSON文件看起来像这样(基本上是一个歌曲对象列表,而不是每行一个!这里只有两个):

[{
    "emotions": [],
    "lyrics": "2222",
    "emotionID": 0,
    "artist": "22453232",
    "sentimentScore": 0,
    "subjects": [],
    "synonymKeyWords": [],
    "keyWords": []
}, {
    "emotions": [],
    "lyrics": "244422",
    "emotionID": 0,
    "artist": "2121222",
    "sentimentScore": 0,
    "subjects": [],
    "synonymKeyWords": [],
    "keyWords": []
}]

我想将歌曲对象读入一个列表,以便我可以追加另一个歌曲对象,然后将其写回。我所拥有的显然是错的。请帮忙。

import json
from song import Song
def writeToFile():
    lyrics = input( "enter lyrics: " )
    artist = input("enter artist name: ")
    songObj = Song(lyrics, artist)
    print(vars(songObj))
    data = []
    with open('testWrite.json') as file:
        data = json.load(file)
        data.append(vars(songObj))
        print(data)
    with open('testWrite.json', 'w') as file:
        json.dump(data, file) 

ctr = "y"
while (ctr=="y"):
    writeToFile()
    ctr = input("continue? y/n?")

也可以打开其他建议,如果我可以避免每次想要添加新歌曲对象时加载所有对象。

2 个答案:

答案 0 :(得分:1)

我认为你有几个问题在这里发生。首先,有效的JSON不使用单引号('),它都是双引号(“)。您正在寻找类似的东西:

[{
"id":123,
"emotions":[],
"lyrics":"AbC",
"emotionID":0,
"artist":"222",
"sentimentScore":0,
"subjects":[],
"synonymKeyWords":[],
"keyWords":[]
},

{
"id":123,
"emotions":[],
"lyrics":"EFG",
"emotionID":0,
"artist":"223",
"sentimentScore":0,
"subjects":[],
"synonymKeyWords":[],
"keyWords":[]
}
]

其次,您需要打开json文件进行读取,然后将其加载为json。以下内容适用于您:

with open(read_file) as file:
  data = json.load(file)

with open(write_file, 'w') as file:
  json.dump(data, file)

print(data)

答案 1 :(得分:0)

data.append(json.loads(f))

这会将您从JSON文件中读取的列表作为单个元素添加到列表中。所以在你的另一个追加之后,列表将有两个元素:一个歌曲列表,以及之后添加的一个歌曲对象。

您应该使用list.extend扩展包含其他列表中项目的列表:

data.extends(json.loads(f))

由于您的列表在此之前是空的,您也可以从JSON加载列表,然后附加到该列表:

data = json.loads(f)
data.append(vars(songObj))