изменение значения JSON - PullRequest
       5

изменение значения JSON

1 голос
/ 11 марта 2020

Я пытаюсь изменить значение в файле JSON, я пробовал следующий код, но он ничего не меняет, поэтому я не уверен, что делаю неправильно ...

def file_filtering(file):
    with open(file, 'r') as f:
        data = json.load(f)
        f.close()
    for elem in data['features']:
        elem = elem[:-1]
    with open(file, 'w') as f:
        json.dump(data, f, indent=4, separators=(',', ': '), sort_keys=False)
        f.close()

Я пытаюсь изменить URL, просто удалив последний символ '/', не удаляя значения в URL.

 "features": {
        "https://services.runescape.com-ow.top/weblogin/loginForm/": {
            "activex_count": 0,
            "addeventlistener_count": 0,
            "alert_count": 0,
        }
}

1 Ответ

2 голосов
/ 11 марта 2020

Проблема в том, что elem = elem[:-1] просто меняет переменную elem и не меняет ключ словаря.

Как правило, трудно заменить ключ на словарь на месте ... Гораздо проще просто создать новый словарь. Вы можете сделать это с помощью диктовок , таких как:

{key[:-1]: value for key, value in data['features'].items()}

, которые можно заменить в данных JSON на:

data['features'] = {
    key[:-1]: value
    for key, value in data['features'].items()}

Вы можете сделать немного лучше, вместо того, чтобы вырезать последний символ клавиши, вы можете явно убрать его из косых черт в конце, используя rstrip():

data['features'] = {
    key.rstrip('/'): value
    for key, value in data['features'].items()}

Соберите все вместе:

with open(file, 'r') as f:
    data = json.load(f)
data['features'] = {
    key.rstrip('/'): value
    for key, value in data['features'].items()}
with open(file, 'w') as f:
    json.dump(data, f, indent=4, separators=(',', ': '), sort_keys=False)

Обратите внимание, что вам не нужно явно вызывать f.close(), при открытии файла в диспетчере контекста (как это делает оператор with) происходит автоматическое закрытие файла после его выхода.

...