2017-01-18 3 views
0

У меня есть JSON-файл, который выглядит следующим образом:Python как обновить JSON файл

{ 
    "files": [ 
     { 
      "nameandpath": "/home/test/File1.zip", 
      "MD5": "e226664e39dc82749d05d07d6c3078b9", 
      "name": "File1" 
     }, 
     { 
      "nameandpath": "/home/test/File2.zip", 
      "MD5": "dbb11b2095c952ff1d4b284523d3085f", 
      "name": "File2" 
     } 
    ] 
} 

Я хочу обновить только две строки nameandpath и MD5, когда условие будет истинным. Условие состоит в том, что если проверенный файл присутствует в файле JSON: я обновлю строку, иначе я добавлю файл со своими 3 значениями.

{ 
    "files": [ 
     { 
      "nameandpath": "/home/test/File1.zip", 
      "MD5": "e226664e39dc82749d05d07d6c3078b9", 
      "name": "File1" 
     }, 
     { 
      "nameandpath": "/home/test/File2.zip", 
      "MD5": "dbb11b2095c952ff1d4b284523d3085f", 
      "name": "File2" 
     } 
     # block added because the file tested wasn't present in json file 
     { 
      "nameandpath": "/home/test/File3.zip", 
      "MD5": "dbb11b2095c952ff1d4b284523d3085f", 
      "name": "File3" 
     } 
    ] 
} 

Я не могу обновить существующие линии я не был в состоянии проверить добавление новых линий.

Не могли бы вы помочь мне?
Как я могу это сделать?

Мой код до сих пор:

# getting file name 
# getting MD5 of the file 

jsonfile = "/home/test/filesliste.json" 

with open(jasonfile, "r+") as json_file: 
     data = json.load(json_file) 
     for tp in data['files']: 
      if tp['name'] == name: 
       if tp['MD5'] == fileMD5: 
        print("same MD5") 
        # adding this file to json file 
       else: 
        print("NOT THE same MD5") 
        # updating the file info into json file 
+0

Вам следует рассмотреть возможность использования другой хэш-функции, чем md5. Он считается сломанным. Хорошей альтернативой может быть SHA-2 или SHA-3. –

+0

Я использую md5, потому что мне нужно проверить, является ли содержимое zip-файлов разными или нет, если они есть, я буду хранить zip и обновить файл jason, иначе я удалю zip-файл. любая идея, как я могу это сделать? – JamesJimmy

+0

@ GeorgSchölly Не сломан. Он больше не считается достаточно безопасным для определенных случаев использования (например, хеширование паролей), но он по-прежнему является прекрасной хеш-функцией, и нет ничего плохого в том, чтобы использовать его для проверки целостности данных. – poke

ответ

0

Это мне не ясно, что именно вы боретесь с. Вот как я бы структурировать код, может быть, это помогает:

jsonfile = "/home/test/filesliste.json" 

# read json file 
with open(jsonfile) as f: 
    data = json.load(f) 

# find index of file or -1 if not found 
index = -1 
for i, tp in enumerate(data['files']): 
    if tp['name'] == name and tp['MD5'] == fileMD5: 
     index = i 
     break 

# update data 
# we're lazy and just delete the old file info, then re-add it 
if index >= 0: 
    del data['files'][index] 

tp = { 
    "name": ..., 
    "nameandpath": ..., 
    "MD5": ..., 
} 
data.append(tp) 

# write data back to file 
with open(jsonfile) as f: 
    # json.dump or something like that 

MD5

MD5 не должны больше использоваться, поскольку он считается неисправным. Если возможно, вы должны заменить его SHA-2 или SHA-3, которые похожи, но гораздо более безопасны.

+0

@ Volcano: Спасибо за ваше редактирование! Я действительно откат, хотя для меня очень странно видеть, что переменная цикла выживает после цикла, поэтому я предпочитаю более явную версию. –

+1

Python - динамический язык, поэтому обычно - когда-то определяемый где-либо в области, переменные выживают. И цикл не является закрытой областью - как на скомпилированных языках. Единственное исключение из правила, с которым я столкнулся до сих пор (каламбур не предназначен) ... Исключение в Python 3.5 - как только вы покидаете предложение _except_, вы теряете перехваченный объект _Except_. Для меня ваша версия выглядела немного не-Pythonic - возможно, я слишком долго думал о Python. – volcano

+0

@volcano: Как бы вы написали его? Я думал о том, чтобы поставить перед индексом 'index = -1', но это тоже не очень элегантно. Я сталкиваюсь с аналогичными ситуациями, когда значение по умолчанию постоянно, и я еще не нашел приятного решения. –