我想在我的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'
方法,它将完全覆盖该文件。
更新值的最佳解决方案是什么?
答案 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)