转换嵌套的Python字典以在CSV输出中的同一行上获取相同级别的键值

时间:2018-03-26 21:04:04

标签: python dictionary nested export-to-csv

以下代码表示我正在尝试转换并导出为CSV的日志数据示例。它可以具有警告错误(例如:代理1)的嵌套字典,或者没有警告错误的字典< / em>(例如:代理人2)。

dlog = \
[
    {
        'agentName': 'agent 1',
        'date': '2018-03-26',
        'fileName': 'log_2018-3-26.log',
        'warning':
            {
                'Street': 618,
                'Suite': 470,
                'TargetID': 558,
                'Error loading page frame': 27,
                'writeOverride': 51,
                'State': 53,
                'Zip': 52,
                'PhoneNumber': 5
            },
        'error':
            {
                'Locations error handling': 1,
                'The web browsers are not responding': 13
            }
    },
    {
        'agentName': 'agent 2',
        'date': '2018-03-26',
        'fileName': 'log_2018-3-26.log'
    }
]

with open('C:\\users\\dbrewer\\documents\\LastLogTest.csv', 'w', newline='') 
as csvOutput:
    fieldnames = ['agentName', 'date', 'fileName', 'warnings', 'warningCount', 'errors', 'errorCount']
    dict_writer = csv.DictWriter(csvOutput, fieldnames)
    dict_writer.writeheader()
    for d in dlog:
        dict_writer.writerow(d)

这是我得到的输出:

Wrong

正如你所看到的,我并没有按照我想要的方式分解嵌套字典中的警告和错误。我已经能够生成一个数据集,将嵌套的dict值转换为列。

这部分正确

Half Correct

但是,这对于工作数据不起作用,因为有许多不同的警告错误键,其中一些相当长。我需要的是导出嵌套警告和错误dicts中每个键,值对的相关键值,值对(agentName,date,fileName)。这将为数据集生成9行和7列(下图)

这是我需要的输出:

Correct

显然有一个解决方案,但我在这里找到的只是将嵌套键转换为列(而不是行)的示例。解决这种转型的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以创建一个函数来展平结构:

import itertools
import csv
def results(d):
  start = [[d[i] for i in ['agentName', 'date', 'fileName']]+list(c) for c in d.get('warning', {'':None}).items()]
  return [filter(None, a+list(b)) if b else a for a, b in itertools.izip_longest(start, d.get('error', {'':None}).items())]

with open('filename.csv', 'w') as f:
   write = csv.writer(f)
   write.writerow(['agentName', 'date', 'fileName', 'warnings', 'warningCount', 'errors', 'errorCount'])
   for data in map(results, dlog):
      write.writerows(data)

输出:

agentName,date,fileName,warnings,warningCount,errors,errorCount
agent 1,2018-03-26,log_2018-3-26.log,writeOverride,51,Locations error handling,1
agent 1,2018-03-26,log_2018-3-26.log,State,53,The web browsers are not responding,13
agent 1,2018-03-26,log_2018-3-26.log,Street,618
agent 1,2018-03-26,log_2018-3-26.log,PhoneNumber,5
agent 1,2018-03-26,log_2018-3-26.log,Zip,52
agent 1,2018-03-26,log_2018-3-26.log,Error loading page frame,27
agent 1,2018-03-26,log_2018-3-26.log,Suite,470
agent 1,2018-03-26,log_2018-3-26.log,TargetID,558
agent 2,2018-03-26,log_2018-3-26.log