[英]Append the data to existing json file
我有一個現有的JSON文件,並嘗試將字符串添加到文件中。 但是,一旦我編寫了JSON文件,換行符就會在JSON文件中消失,格式也會更改。
下面是代碼:
#!/usr/bin/python
import json
userinput = raw_input('Enter the name of a file a you want to read: ')
with open(userinput) as json_data:
s = json_data.read()
data = json.loads(s)
print data['classes']
json_data.close()
class_add = raw_input('Enter the name of a class a you want to add: ')
if class_add in data['classes']:
print "Class %s already exists, doing nothing." % class_add
else:
data['classes'].append(class_add)
print json.dumps(data)
print data['classes']
with open(userinput, 'w') as json_data:
json_data.write(json.dumps(data))
json_data.close()
這里的另一項導入是JSON文件的格式。 因此,默認情況下,我們將使用以下格式的文件。
# cat test.json
{
"selinux_mode": "enforcing",
"cis_manages_auditd_service": true,
"classes": [ "basic", "admin", "lvm"]
}
#
但是,一旦我們添加了類,它就會變成以下內容。
# cat test.json
{"cis_manages_auditd_service": true, "classes": [ "basic", "admin", "lvm"], "selinux_mode": "enforcing"}
有什么辦法可以保持JSON空格和換行符,而無需進行任何更改。
JSON不需要特定的布局,但是對於較差的人類可讀性,您可以提供indent=2
import sys
import json
userinput = raw_input('Enter the name of a file a you want to read: ')
with open(userinput) as json_data:
data = json.load(json_data)
print(data['classes'])
class_add = raw_input('Enter the name of a class a you want to add: ')
if class_add in data['classes']:
print("Class {} already exists, doing nothing.".format(class_add))
else:
data['classes'].append(class_add)
json.dump(data, sys.stdout, indent=2)
print(data['classes'])
with open(userinput, 'w') as json_data:
json.dump(data, json_data, indent=2)
請注意,如果使用with
語句打開文件,則不應顯式關閉文件(無論是否存在異常,都應在代碼塊末尾完成)。
如果要寫入文件, json.dumps(data)
JSON作為字符串處理,還應避免使用json.dumps(data)
而應使用json.dump(data, file_pointer)
。 json.loads()
和json.load()
。
您可以將函數json.dumps()
的indent
參數設置為表示要縮進的空格數的整數。
這仍然會將輸出的格式修改為如下所示:
import json
s = '''{
"selinux_mode": "enforcing",
"cis_manages_auditd_service": true,
"classes": [ "basic", "admin", "lvm"]
}'''
data = json.loads(s)
>>> print(json.dumps(data))
{"cis_manages_auditd_service": true, "classes": ["basic", "admin", "lvm"], "selinux_mode": "enforcing"}
>>> print(json.dumps(data, indent=4))
{
"cis_manages_auditd_service": true,
"classes": [
"basic",
"admin",
"lvm"
],
"selinux_mode": "enforcing"
}
原始版本和更新版本之間的區別在於, classes
列表現在跨多行顯示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.