2016-04-09 2 views
1

Я пытаюсь читать существующие данные из json-файла и пытаюсь добавить больше данных в файл с помощью python (я новичок python). Вот мои существующие данные в data.json файл, который я прочитал в моем сценарии:python: прочитайте json данные из файла и добавьте больше данных

{ 
    "Config1": { 
     "TestCase1": { 
      "Data1": 200, 
      "Data2": 2715 
     } 
    }, 
    "Config2": { 
     "TestCase1": { 
      "Data1": 2710, 
      "Data2": 2715 
     } 
    } 
} 

После прочтения я хочу добавить данные TestCase2. Это то, что я делаю:

with open("data.json") as json_file: #load existing data 
    json_data = json.load(json_file) 

test='TestCase2' 
result=json_data 
myConfigs = ['Config1','Config2'] 
for each, config in enumerate(myConfigs): 
    result.update({config:{test:{'Data1':2600,'Data2':2900}}}) 
with open('data.json', 'a') as outfile: 
    json.dump(result, outfile) 

Новые данные в data.json не действует как указано на jsonLint. Что я делаю не так? Вот новые данные

{ 
     "Config1": { 
      "TestCase1": { 
       "Data1": 200, 
       "Data2": 2715 
      } 
     }, 
     "Config2": { 
      "TestCase1": { 
       "Data1": 2710, 
       "Data2": 2715 
      } 
     } 
    } { 
     "Config1": { 
      "TestCase2": { 
       "Data1": 2600, 
       "Data2": 2900 
      } 
     }, 
     "Config2": { 
      "TestCase2": { 
       "Data1": 2600, 
       "Data2": 2900 
      } 
     } 
    } 
+0

ДИКТ в result.update выглядит так (без кавычек на клавишах), и метод JSON должен быть '' loads' и dumps' ... – bozdoz

+0

@bozdoz 'loads' использует строку 'load' (или все, что реализует' read() ') – xvan

ответ

2

В дополнение к открытию файла в неправильном режиме (должно быть «w»), вы также перезаписываете старые «config» деревья, определяя новую встроенную строку dict.

Вместо:

result.update({config:{test:{'Data1':2600,'Data2':2900}}}) 

Попробуйте это:

result[config][test] = {'Data1': 2600, 'Data2': 2900} 

Это должно дать вам результат, который вы ищете с вашим примером. Это позволит сохранить result['Config1']['TestCase1'] при добавлении TestCase2. Вам также может потребоваться убедиться, что дерево конфигурации существует, установив result[config] на {}, если это None.

2

Проблема в том, что вы Добавляя новый JSON к оригинальному JSON файл здесь:

with open('data.json', 'a') as outfile: 
    json.dump(result, outfile) 

Так у вас есть два объекта JSON в том же файле, как вы можете см.:

... 
      "Data2": 2715 
     } 
    } 
} { <--- original object ends here, new object starts here 
    "Config1": { 
... 

JSONLint ожидает единственный объект, как и любой анализатор JSON.

0

Основная проблема заключается в том, что метод dict1.update(dict2) перезаписывает dict1 ключи, если же существуют в dict2, следовательно, второй объект в файле не имеет ключ =>TestCase1

Другая проблема заключается в том, что (как указано выше) файл открывается в неправильном режиме (Должно быть w), как a добавляет к файлу JSon

Вы можете попробовать это:

with open("data.json") as json_file: 
    json_data = json.load(json_file) 

test='TestCase2' 
result=json_data 
myConfigs = ['Config1','Config2'] 
for each, config in enumerate(myConfigs): 
    result[config].update({test:{'Data1':2600,'Data2':2900}}) 
with open('data.json', 'w') as outfile: 
    json.dump(result, outfile) 

Просто result[config].update(... вместо result.update({config:...

Смежные вопросы