Как заменить все значение существования чем-то другим - PullRequest
0 голосов
/ 24 июня 2018

Я хотел бы найти простой способ замены значений в файле JSON.

Я ищу что-то похожее на:

json_file.replace("-", "")

SAMPLE:

"scores": {
                "count": 1,
                "my-followings": 420,
                "my-plain-tweets": 0,
                "my-tweets-with-links": 1,
                "my-tweets-with-image": 0,
                "my-replies": 0,
                "my-listed": 113,
                "my-retweets": 0,
                "my-statuses": 3653,
                "my-followers": 8536,
                "favourites": 0,
                "my-tweets-with-video": 0,
                "my-favourites": 7929,
                "retweets": 0
            }

ОЖИДАЕТСЯ:

"scores": {
                "count": 1,
                "myfollowings": 420,
                "myplaintweets": 0,
                "mytweetswithlinks": 1,
                "mytweetswithimage": 0,
                "myreplies": 0,
                "mylisted": 113,
                "myretweets": 0,
                "mystatuses": 3653,
                "myfollowers": 8536,
                "favourites": 0,
                "mytweetswithvideo": 0,
                "myfavourites": 7929,
                "retweets": 0
            }

Добавлен пример и то, что я ожидал.

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Средство командной строки предназначено для этого типа проблемы.

Например, предположим, что вы хотите изменить ВСЕ дефисы во ВСЕХ именах ключей (но только имена ключей) во ВСЕХ объектах, независимо от того, насколько глубоко вложен:

walk(if type == "object" then with_entries(.key |= gsub("-";"")) else . end)

Если вы хотите изменить только ПЕРВЫЙ гипен, вы должны изменить gsub на sub.

Если у вашего jq нет walk/1, вы можете включить его определение, например,

# Apply f to composite entities recursively, and to atoms
def walk(f):
  . as $in
  | if type == "object" then
      reduce keys_unsorted[] as $key
        ( {}; . + { ($key):  ($in[$key] | walk(f)) } ) | f
  elif type == "array" then map( walk(f) ) | f
  else f
  end;

walk(if type == "object" then with_entries(.key |= gsub("-";"")) else . end)

Вызов с sponge

Если вы хотите перезаписать входной файл, вам пригодится такая утилита, как sponge. Например, если JSON находится в файле, скажем input.json, и если jq-программа, как указано выше, находится в program.jq, то вы можете выполнить следующее: следующим образом:

jq -f program.jq input.json | sponge input.json
0 голосов
/ 24 июня 2018

Использование str.replace

Демо:

import json
with open(filename, "r") as infile:                    #Read json
    data = json.load(infile)

data = dict((k.replace("-", ""), v) for k, v in data["scores"].items())  #Remove "-"
with open(filename, "w") as outfile:                    #Write back to file
    data = json.dump({"scores": data}, outfile)

Редактировать согласно комментарию

with open(filename, "r") as infile:
    data = infile.read().replace("-", "")

with open(filename, "w") as outfile:
    outfile.write(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...