以下代码表示我正在尝试转换并导出为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)
这是我得到的输出:
正如你所看到的,我并没有按照我想要的方式分解嵌套字典中的警告和错误。我已经能够生成一个数据集,将嵌套的dict值转换为列。
这部分正确
但是,这对于工作数据不起作用,因为有许多不同的警告和错误键,其中一些相当长。我需要的是导出嵌套警告和错误dicts中每个键,值对的相关键值,值对(agentName,date,fileName)。这将为数据集生成9行和7列(下图)
这是我需要的输出:
显然有一个解决方案,但我在这里找到的只是将嵌套键转换为列(而不是行)的示例。解决这种转型的最佳方法是什么?
答案 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