簡體   English   中英

將數據追加到現有的json文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM