Python - 更新现有json文件中的项目

时间:2016-11-10 14:44:36

标签: python json file

我想在我的float文件中更新values json,其结构如下:

{"Starbucks": {"Roads": 1.0, "Pyramid Song": 1.0, "Go It Alone": 1.0}}

因此,每当我使用完全相同的项目生成已有的播放列表时,我都会将key values增加+ 1.0

我有一个用'append'选项

打开的文件
with open('pre_database/playlist.json', 'a') as f:
     if os.path.exists('pre_database/playlist.json'):
         #update json here
     json.dump(playlist,f)

但是此'a'方法会将另一个dictionary附加到json,之后会产生parsing个问题。

同样,如果我使用'w'方法,它将完全覆盖该文件。

更新值的最佳解决方案是什么?

3 个答案:

答案 0 :(得分:2)

您可以在r+模式下打开文件(打开文件进行读取和写入),读入JSON内容,搜索回到文件的开头,截断文件然后将修改后的字典重写回文件:

if os.path.exists('pre_database/playlist.json'):
    with open('pre_database/playlist.json', 'r+') as f:
         playlist = json.load(f)
         # update json here
         f.seek(0)
         f.truncate()
         json.dump(playlist, f)

答案 1 :(得分:1)

Appending表示您的文件越来越长,这既不是您的意思,也不是JSON的工作原理。

如果你想更新一些值,你需要加载json文件,更新你的值并将其转储回来:

with open('pre_database/playlist.json', 'r') as f:
    playlist = json.load(f)
playlist[key] = value  # or whatever
with open('pre_database/playlist.json', 'w') as f:
    json.dump(playlist, f)

另外,检查文件是否存在应该在打开文件之前发生,而不是在文件已经打开时发生:

if os.path.exists('pre_database/playlist.json'):
    with open('pre_database/playlist.json', 'r') as f:
        playlist = json.load(f)
    playlist[key] = value  # or whatever
    with open('pre_database/playlist.json', 'w') as f:
        json.dump(playlist, f)

虽然我猜pythonic方法只是尝试它并且如果文件不按预期存在则捕获IOError

根据你的继续方式,最好做这样的事情:

try:
    with open('pre_database/playlist.json', 'r') as f:
        playlist = json.load(f)
except IOError, ValueError:
    playlist = default_playlist

playlist[key] = value  # or whatever

with open('pre_database/playlist.json', 'w') as f:
    json.dump(playlist, f)

罗宾

答案 2 :(得分:0)

它是追加新字典,因为文件以追加模式打开并且光标位于文件末尾。您需要在将最新的 dict 转储到文件之前进行截断

with open('pre_database/playlist.json', 'a') as f:
    if os.path.exists('pre_database/playlist.json'):
        f.seek(0)
        playlist = json.load(f)
        #Update your dict here
        playlist.update(dict({'key1':'NewValue1'}))
        f.truncate(0)
        playlist.dump(playlist,f)