2015-08-31 3 views
1

Я новичок в python, и то, что я пытаюсь сделать, это заменить текст/строку в json-файле из команды python os shell. Я несколько получаю результаты, которые ищу, но добавляет лишние пробелы/создает новую строку в json-файле. Это в основном то, что я пытаюсь выполнить:Python: Замените строку в json-файле, из команды оболочки python

  1. У меня есть статический файл JSon (add.json)
  2. Я бегу две команды OS оболочки внутри питона и хранения, что вывод в отдельных текстовых файлов ,
  3. Затем я хочу взять значения в этих двух файлах txt и заменить две строки в json-файле.

Ниже то, что я в настоящее время (чтобы сделать это просто я заменил истинную AWS команды консоли с простыми командами)

import os 
import fileinput 

cmd = 'hostname > host.txt' 
cmd2 = 'echo mama > echo.txt' 

os.system(cmd) 
os.system(cmd2) 

file = open('host.txt') 
contents = file.read() 
with open("out.json", "wt") as fout: 
with open("add.json", "rt") as fin: 
    for line in fin: 
     fout.write(line.replace('dns',contents)) 

file2 = open('echo.txt') 
contents2 = file2.read() 
with open("out2.json", "wt") as fout2: 
    with open("out.json", "rt") as fin2: 
    for line in fin2: 
     fout2.write(line.replace('ip', contents2)) 

И это результат, который он приносит:

{ 
"Comment": "A new record set for the zone.", 
"Changes": [ 
{ 
    "Action": "CREATE", 
    "ResourceRecordSet": { 
    "Name": "WildburritoPC 
", 
    "Type": "A", 
    "TTL": 60, 
    "ResourceRecords": [ 
     { 
     "Value": "mama 
" 
     } 
    ] 
    } 
    } 
] 
} 

Как вы можете видеть, после имени и значения он действительно заменяет значения, но добавляет новую строку и создает недопустимый json.

Это файл, я заменяя значение:

{ 
"Comment": "A new record set for the zone.", 
"Changes": [ 
{ 
    "Action": "CREATE", 
    "ResourceRecordSet": { 
    "Name": "dns", 
    "Type": "A", 
    "TTL": 60, 
    "ResourceRecords": [ 
     { 
     "Value": "ip" 
     } 
    ] 
    } 
    } 
] 
} 

Заранее спасибо за любые ответы. Я знаю, что то, что у меня выше, очень грязное, и я уверен, что должен быть лучший/более чистый способ выполнить то, что я пытаюсь сделать, но в конце концов я знаю, что мы все должны начать с чего-то, и я даже не могу начать чтобы объяснить, насколько я благодарен этому сообществу за всю помощь, которую он предоставил до сих пор.

+0

Вы можете взглянуть на [json encoder] Python (https://docs.python.org/3/library/json.html), который преобразует JSON-данные в словари. После этого вы можете адаптировать этот словарь и записать его обратно в JSON-файл. – albert

ответ

1

просто открыть этот файл как обычный текстовый файл и заменить строку, которую вы хотите

with open('file.json', 'r+') as file: 
    content = file.read() 
    file.seek(0) 
    content.replace('string_replaced', 'new_string') 
    file.write(content) 

Поскольку вы хотите везде заменить строку, это не имеет значения, данные в формате JSON или не

+0

Даже если ваше решение будет работать, это не очень хорошая практика для работы с json. (just sayin) – beezz

+0

Спасибо за ваше время, чтобы ответить. предполагается, что «new_string» будет заменен содержимым, которое у меня есть в echo.txt, и когда я его вложу, я получаю: file.write (content) Ошибка IOError: [Errno 0]. Ниже приведено то, что у меня есть: 'import os import fileinput import json cmd = 'hostname> host.TXT» cmd2 = 'эхо-мама> echo.txt' os.system (CMD) os.system (cmd2) файл2 = открыт ('echo.txt') contents2 = file2.read() с open ('add.json', 'r +') в качестве файла: content = file.read() content.replace ('dns', contents2) file.write (content) ' – lo7962

+0

Извините, я пытался представить комментарий легче читать. – lo7962

1

В стандартной библиотеке python есть модуль json, для его использования будет гораздо больше ошибок, чем для замены строк.

Для загрузки файла json:

import json 
with open("add.json", "r") as add: 
    json_data = json.load(fout2) 
    for change in json_data["Changes"]: 
     # strip the contents of trailing white spaces (new line) 
     change["Name"] = contents.strip() 

# dump json to another file 
with open("out.json", "w") as fout: 
    four.write(json.dumps(json_data)) 

Я думаю, что вы получили эту идею. Модуль json позаботится о том, чтобы ваши json-данные не были повреждены (или, по крайней мере, сбой произойдет, если это произойдет).

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