添加"条目"使用Python

时间:2015-05-28 11:06:36

标签: python json python-2.7

我需要用python修改JSON文件。当我第一次使用python(和JSON)时,我阅读了一些关于它的文章,但并没有完全理解它。

我设法将一个JSON导入python,作为某种数组(或列表?)。

JSON看起来像这样:

{
  "sources":[{
    "id":100012630,
    "name":"Activity Login Page",
    "category":"NAM/Activity",
    "automaticDateParsing":true,
    "multilineProcessingEnabled":false,
    "useAutolineMatching":false,
    "forceTimeZone":true,
    "timeZone":"Europe/Brussels",
    "filters":[],
    "cutoffTimestamp":1414364400000,
    "encoding":"UTF-8",
    "pathExpression":"C:\\NamLogs\\nam-login-page.log*",
    "blacklist":[],
    "sourceType":"LocalFile",
    "alive":true
  },{
    "id":100001824,
    "name":"localWinEvent",
    "category":"NAM/OS/EventLog",
    "automaticDateParsing":true,
    "multilineProcessingEnabled":false,
    "useAutolineMatching":false,
    "forceTimeZone":false,
    "filters":[],
    "cutoffTimestamp":1409090400000,
    "encoding":"UTF-8",
    "logNames":["Security","Application","System","Others"],
    "sourceType":"LocalWindowsEventLog",
    "alive":true
  },{
    "id":100001830,
    "name":"localWinPerf",
    "category":"NAM/OS/Perf",
    "automaticDateParsing":false,
    "multilineProcessingEnabled":false,
    "useAutolineMatching":false,
    "forceTimeZone":false,
    "filters":[],
    "cutoffTimestamp":0,
    "encoding":"UTF-8",
    "interval":60000,
    "wmiQueries":[{
      "name":"NAMID Service",
      "query":"SELECT * FROM Win32_PerfRawData_PerfProc_Process WHERE Name = 'tomcat7'"
    },{
      "name":"CPU",
      "query":"select * from Win32_PerfFormattedData_PerfOS_Processor"
    },{
      "name":"Logical Disk",
      "query":"select * from Win32_PerfFormattedData_PerfDisk_LogicalDisk"
    },{
      "name":"Physical Disk",
      "query":"select * from Win32_PerfFormattedData_PerfDisk_PhysicalDisk"
    },{
      "name":"Memory",
      "query":"select * from Win32_PerfFormattedData_PerfOS_Memory"
    },{
      "name":"Network",
      "query":"select * from Win32_PerfFormattedData_Tcpip_NetworkInterface"
    }],
    "sourceType":"LocalWindowsPerfMon",
    "alive":true
  },

现在,当我收到数百个这样的文件时,我在整个目录中编写了一个foreach:

for filename in os.listdir('./json/'):
   with open('./json/'+filename) as data_file:    
   sources = json.load(data_file)

现在我需要在源代码中再次使用foreach源代码,它会向每个源添加一行(或者一个条目或者#J;行"在JSON中被调用)(类似于collectorName = fileName)然后用新文件覆盖旧文件。

JSON将如下所示:

   {
      "sources":[{
        "id":100012630,
        "name":"Activity Login Page",
        "category":"NAM/Activity",
        "automaticDateParsing":true,
        "multilineProcessingEnabled":false,
        "useAutolineMatching":false,
        "forceTimeZone":true,
        "timeZone":"Europe/Brussels",
        "filters":[],
        "cutoffTimestamp":1414364400000,
        "encoding":"UTF-8",
        "pathExpression":"C:\\NamLogs\\nam-login-page.log*",
        "blacklist":[],
        "sourceType":"LocalFile",
        "alive":true,
        "collectorName":"Collector2910"
      },{
        "id":100001824,
        "name":"localWinEvent",
        "category":"NAM/OS/EventLog",
        "automaticDateParsing":true,
        "multilineProcessingEnabled":false,
        "useAutolineMatching":false,
        "forceTimeZone":false,
        "filters":[],
        "cutoffTimestamp":1409090400000,
        "encoding":"UTF-8",
        "logNames":["Security","Application","System","Others"],
        "sourceType":"LocalWindowsEventLog",
        "alive":true,
        "collectorName":"Collector2910"
      },{.....

我希望我可以解释我的问题,如果有人可以帮助我,我会感到高兴(即使有完全不同的解决方案)。

提前致谢

迈克尔

2 个答案:

答案 0 :(得分:2)

这是一种方法:

for filename in os.listdir('./json/'):
    sources = None
    with open('./json/'+filename) as data_file:    
        sources = json.load(data_file)
        sourcelist = sources['sources']
        for i, s in enumerate(sourcelist):
            sources['sources'][i]['collectorName'] = 'Collector' + str(i)
    with open('./json/'+filename, 'w') as data_file:  
        data_file.write(json.dumps(sources))

答案 1 :(得分:1)

for filename in os.listdir('./json/'):
   with open('./json/'+filename) as data_file:    
       datadict = json.load(data_file)
   # At this point you have a plain python dict.
   # This dict has a 'sources' key, pointing to
   # a list of dicts. What you want is to add
   # a 'collectorName': filename key:value pair
   # to each of these dicts
   for record in datadict["sources"]:
       record["collectorName"] = filename
   # now you just have to serialize your datadict back
   # to json and write it back to the file - which is
   # in fact a single operation
   with open('./json/'+filename, "w") as data_file:    
       json.dump(datadict, data_file)