我有一个复杂的多维字典,我想将一些键值对导出为csv文件作为运行日志文件。我已经尝试了导出到cvs函数的各种帮助,并在遍历多维字典时在stackoverflow中破解了大部分代码示例,但未能找到解决方案。这个问题也很独特,因为它只有一些我想要导出的键值。
这是字典:
cpu_stats = {'time_stamp': {'hour': 22, 'month': 5, 'second': 43, 'year': 2014, 'day': 29, 'minute': 31}, 'cpus': [[{'metric_type': 'CPU_INDEX', 'value': 1}, {'metric_type': 'CPU_TEMPERATURE', 'value': 39}, {'metric_type': 'CPU_FAN_SPEED', 'value': 12000}]]}
我需要将time_stamp中的值格式化为yyyy-mm-dd hh:mm:ss并将其存储为行的第一个单元格。然后,我需要'cpus'中的值,CPU_INDEX,CPU_TEMPERATURE和CPU_FAN_SPEED与时间戳位于同一行。
csv文件应如下所示:
time_stamp, cpu_index, cpu_temperature, cpu_fan_speed
2014-05-29, 1, 38, 12000
我一直在攻击的一个例子是:
def walk_dict(seq, level=0):
"""Recursively traverse a multidimensional dictionary and print all
keys and values.
"""
items = seq.items()
items.sort()
for v in items:
if isinstance(v[1], dict):
# Print the key before make a recursive call
print "%s%s" % (" " * level, v[0])
nextlevel = level + 1
walk_dict(v[1], nextlevel)
else:
print "%s%s %s" % (" " * level, v[0], v[1])
我得到以下输出
walk_dict(cpu_stats)
cpus [[{'metric_type': 'CPU_INDEX', 'value': 1}, {'metric_type': 'CPU_TEMPERATURE', 'value': 38}, {'metric_type': 'CPU_FAN_SPEED', 'value': 12000}]]
time_stamp
day 29
hour 22
minute 17
month 5
second 19
year 2014
我也一直在攻击这个函数,希望我可以将日期信息存储到变量中,然后可以将它们格式化为单个字符串。不幸的是,它有递归调用,在后续调用中松散了局部变量。使用全球是徒劳的。
def parseDictionary(obj, nested_level=0, output=sys.stdout):
spacing = ' '
if type(obj) == dict:
print >> output, '%s{' % ((nested_level) * spacing)
for k, v in obj.items():
if hasattr(v, '__iter__'):
# 1st level, prints time and cpus
print >> output, '%s:' % (k)
parseDictionary(v, nested_level + 1, output)
else:
# here is the work
if k == "hour":
hour = v
elif k == "month":
month = v
elif k == "second":
second = v
elif k == "year":
year = v
elif k == "day":
day = v
elif k == "minute":
minute = v
print >> output, '%s %s' % (k, v)
print >> output, '%s}' % (nested_level * spacing)
elif type(obj) == list:
print >> output, '%s[' % ((nested_level) * spacing)
for v in obj:
if hasattr(v, '__iter__'):
parseDictionary(v, nested_level + 1, output)
else:
print >> output, '%s%s' % ((nested_level + 1) * spacing, v)
print >> output, '%s]' % ((nested_level) * spacing)
else:
print >> output, '%s%s' % (nested_level * spacing, obj)
if __name__ == "__main__":
global year
global month
global day
global hour
global minute
global second
cpu_stats = {'time_stamp': {'hour': 22, 'month': 5, 'second': 43, 'year': 2014, 'day': 29, 'minute': 31}, 'cpus': [[{'metric_type': 'CPU_INDEX', 'value': 1}, {'metric_type': 'CPU_TEMPERATURE', 'value': 39}, {'metric_type': 'CPU_FAN_SPEED', 'value': 12000}]]}
parseDictionary(cpu_stats)
print '%s-%s-%s %s:%s:%s' % (year, month, day, hour, minute, second)
输出:
{
time_stamp:
{
hour 22
month 5
second 27
year 2014
day 29
minute 57
cpus:
[
[
{
metric_type CPU_INDEX
value 1
{
metric_type CPU_TEMPERATURE
value 39
{
metric_type CPU_FAN_SPEED
value 12000
]
]
Traceback (most recent call last):
File "./cpu.py", line 135, in <module>
print '%s-%s-%s %s:%s:%s' % (year, month, day, hour, minute, second)
NameError: global name 'year' is not defined
谢谢,我感谢任何帮助,指出我正确的方向,因为我现在不知所措。
答案 0 :(得分:1)
我想你可能会忽略字典的重点。您应该只查找所需的密钥,而不是遍历字典的键并检查它是否是您想要的密钥。像这样处理问题可能更容易:
t = cpu_stats['time_stamp']
date = '{}-{}-{}'.format(t['year'], t['month'], t['day'])
for cpu in cpu_stats['cpus']:
c = {d['metric_type']: d['value'] for d in cpu}
row = [date, c['cpu_index'], c['cpu_temperature'], c'[cpu_fan_speed']]
如果您将cpus
值作为字典列表而不是字典列表列表,并将时间戳存储为日期时间对象,那么生活会更容易:
cpu_stats = {'time_stamp': datetime.datetime(2014, 5, 29, 22, 31, 43), 'cpus': [{'CPU_INDEX': 1, 'CPU_TEMPERATURE': 39, 'CPU_FAN_SPEED': 12000}]}
如果你把它埋在像{'key_name': 'my_key', 'key_value': 'my_value'}
这样的结构中,那么字典的全部内容就会丢失。这只是添加了一个您不需要的额外图层,而只需要:{'my_key': 'my_value'}
答案 1 :(得分:0)
我同意@desired登录,但假设您无法控制传入的数据并且必须使用您在问题中显示的内容......您可以像这样遍历它:
cpu_stats = {'time_stamp': {'hour': 22, 'month': 5, 'second': 43, 'year': 2014, 'day': 29, 'minute': 31},
'cpus': [ [{'metric_type': 'CPU_INDEX', 'value': 1}, {'metric_type': 'CPU_TEMPERATURE', 'value': 39}, {'metric_type': 'CPU_FAN_SPEED', 'value': 12000} ] ]
}
timestamp = ''
for stats in cpu_stats.keys():
if stats == 'time_stamp':
timestamp = '{year}-{month}-{day}'.format(**cpu_stats[stats])
if stats == 'cpus':
for cpu in cpu_stats[stats]:
cpu_index = ''
cpu_temperature = ''
cpu_fan_speed = ''
for metric in cpu:
if metric['metric_type'] == 'CPU_INDEX':
cpu_index = str(metric['value'])
elif metric['metric_type'] == 'CPU_TEMPERATURE':
cpu_temperature = str(metric['value'])
elif metric['metric_type'] == 'CPU_FAN_SPEED':
cpu_fan_speed = str(metric['value'])
print ','.join([timestamp, cpu_index, cpu_temperature, cpu_fan_speed])