如何正确地将键值附加到JSON文件(不创建额外的结构)?

时间:2019-06-20 19:53:19

标签: python arrays json

我想在Python中创建JSON文件,该文件存储X和Y值。它应该看起来像这样:

{"X": [[1,2,3], [2,3,5], [1,2,6], [1,2,3], [2,3,5], [1,2,6]],"Y": [3,5,1,3,5,1]}

这是我编写的代码,首先我要检查文件是否为空(如果是,则在json文件中创建X和Y)。

  def save_data(x, y):
        data_from_json = {}
        with open('data_sets.json', 'r+') as json_file:
            if (os.stat('data_sets.json').st_size == 0):
                if "X" not in data_from_json:
                    data_from_json.setdefault('X', x)
                if "Y" not in data_from_json:
                    data_from_json.setdefault('Y', y)
                json.dump(data_from_json, json_file)
        with open('data_sets.json', 'r+') as json_file:
            data_from_json = json.load(json_file)
            data_from_json['X'].append(x)
            data_from_json['Y'].append(y)
            json.dump(data_from_json, json_file)

我得到的是这样的:

{"X": [[1,2,3], [2,3,5], [1,2,6]],"Y": [3,5,1]}{"X": [[1,2,3], [2,3,5], [1,2,6]],"Y": [3,5,1]} 

而不是在X和Y后面附加新值。我该怎么办?

1 个答案:

答案 0 :(得分:1)

文件为空时,您将JSON写入两次。编写初始字典,然后再次读取文件,并将其追加到XY列表中。

将代码路径分为两部分更为简单:一个用于创建初始文件,另一部分用于附加到现有文件。

此外,如果使用相同的文件开头来读取和写入文件,则需要在它们之间调用seek()以倒退到文件的开头。否则,您将在原始版本之后编写更新后的JSON。

def save_data(x, y):
    if (os.stat('data_sets.json').st_size == 0):
        # File is empty, create initial dictionary
        data_from_json = {"X": [x], "Y", [y]}
        with open('data_sets.json', 'w') as json_file:
            json.dump(data_from_json, json_file)
    else:
        with open('data_sets.json', 'r+') as json_file:
            data_from_json = json.load(json_file)
            data_from_json.setdefault('X', [])
            data_from_json.setdefault('Y', [])
            data_from_json['X'].append(x)
            data_from_json['Y'].append(y)
            json_file.seek(0)
            json.dump(data_from_json, json_file)