Python-现有json文件中的更新项
我想在我的Python-现有json文件中的更新项,python,json,file,Python,Json,File,我想在我的json文件中更新float值,结构如下: {"Starbucks": {"Roads": 1.0, "Pyramid Song": 1.0, "Go It Alone": 1.0}} 因此,每当我生成一个已经存在的播放列表时,使用完全相同的项目,我会按+1.0递增键值 我用'append'选项打开了一个文件 with open('pre_database/playlist.json', 'a') as f: if os.path.exists('pre_database/
json
文件中更新float
值
,结构如下:
{"Starbucks": {"Roads": 1.0, "Pyramid Song": 1.0, "Go It Alone": 1.0}}
因此,每当我生成一个已经存在的播放列表时,使用完全相同的项目,我会按+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'
方法会将另一个字典
附加到json
中,随后会产生解析
问题
同样,如果我使用'w'
方法,它将完全覆盖文件
更新值的最佳解决方案是什么?您可以在
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)
您可以在
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)
追加
意味着文件越来越长,这既不是您想要的,也不是JSON的工作方式
如果要更新某些值,需要加载json文件,请更新值并将其转储回:
以open('pre_database/playlist.json','r')作为f的:
playlist=json.load(f)
播放列表[键]=值#或其他
将open('pre_database/playlist.json','w')作为f:
json.dump(播放列表,f)
此外,应在打开文件之前检查文件是否存在,而不是在文件已打开时:
如果os.path.exists('pre_database/playlist.json'):
将open('pre_database/playlist.json','r')作为f:
playlist=json.load(f)
播放列表[键]=值#或其他
将open('pre_database/playlist.json','w')作为f:
json.dump(播放列表,f)
虽然我猜python的方法是,如果文件没有如预期的那样存在,就尝试一下并捕获IOError
根据您继续的方式,可能最好执行以下操作:
{"Starbucks": {"Roads": 1.0, "Pyramid Song": 1.0, "Go It Alone": 1.0}}
试试看:
将open('pre_database/playlist.json','r')作为f:
playlist=json.load(f)
除了IOError,ValueError:
playlist=默认播放列表
播放列表[键]=值#或其他
将open('pre_database/playlist.json','w')作为f:
json.dump(播放列表,f)
Robin
追加
意味着您的文件越来越长,这既不是您想要的,也不是JSON的工作方式
如果要更新某些值,需要加载json文件,请更新值并将其转储回:
以open('pre_database/playlist.json','r')作为f的:
playlist=json.load(f)
播放列表[键]=值#或其他
将open('pre_database/playlist.json','w')作为f:
json.dump(播放列表,f)
此外,应在打开文件之前检查文件是否存在,而不是在文件已打开时:
如果os.path.exists('pre_database/playlist.json'):
将open('pre_database/playlist.json','r')作为f:
playlist=json.load(f)
播放列表[键]=值#或其他
将open('pre_database/playlist.json','w')作为f:
json.dump(播放列表,f)
虽然我猜python的方法是,如果文件没有如预期的那样存在,就尝试一下并捕获IOError
根据您继续的方式,可能最好执行以下操作:
{"Starbucks": {"Roads": 1.0, "Pyramid Song": 1.0, "Go It Alone": 1.0}}
试试看:
将open('pre_database/playlist.json','r')作为f:
playlist=json.load(f)
除了IOError,ValueError:
playlist=默认播放列表
播放列表[键]=值#或其他
将open('pre_database/playlist.json','w')作为f:
json.dump(播放列表,f)
Robin这是追加新词典,因为文件是在追加模式下打开的,光标位于文件的末尾。您需要在将最新的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)
它是appendind new dictionary,因为文件是在append模式下打开的,并且光标位于文件的末尾。您需要在将最新的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)
@确实是这样,但是在文件被截断之前,您需要先从文件中读取数据,因此
w
在这里不起作用。您需要手动截断。@data\u确实如此,但您需要在文件被截断之前先从文件中读取数据,因此w
在这里不起作用。您需要手动截断。