转换嵌套的Python字典以获取CSV outpu中同一行上的samelevel键值

2024-05-16 20:02:42 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码表示一个示例a日志数据,我正在尝试转换并导出到CSV。它可以有警告错误的嵌套dict(例如:代理1),也可以没有警告错误的dict(例如:代理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来警告和错误。我已经能够生成一个数据集,将嵌套的dict值转换为列

这部分是正确的

Half Correct

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

这是我需要的输出:

Correct

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


Tags: csv数据log警告示例代理date错误
1条回答
网友
1楼 · 发布于 2024-05-16 20:02:42

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

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

相关问题 更多 >