Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-现有json文件中的更新项_Python_Json_File - Fatal编程技术网

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
在这里不起作用。您需要手动截断。