使用python将Dictionary日志文件转换为csv



我想转换日志文件,这里的日志文件:

{'convolution': 2, 'cov2d_layers': [256, 256], 'fc_layers': 3, 'neurons': [256, 128, 1024], 'optimizer': 'rmsprop'}
Accuracy: 46.63%
{'convolution': 3, 'cov2d_layers': [128, 32, 128], 'fc_layers': 3, 'neurons': [1024, 1024, 1024], 'optimizer': 'adam'}
Accuracy: 39.57%
...

我需要一个完整的csv文件,如下所示:

convolution, conv2d_layers, fc_layers, neurons, optimizer, accuracy
2, [256,256], 3, [256, 128,1024], 46,63%

如何使用python脚本来完成此操作?

需要明确的是:您请求的示例输出不符合典型的"csv"样式(逗号分隔的值(。类似地,输入日志文件仅部分符合json样式。

读取日志文件

import itertools
import json
data = [];
with open('in.txt', 'r') as file:
for line1,line2 in itertools.zip_longest(*[file]*2):
line1 = line1.replace(''','"')      #convert to json
line2 = line2.split(':')[-1].strip() #extract number
d = json.loads(line1) #create dictionary
d['accuracy'] = line2 #add manually
data.append(d)

创建csv

在您的情况下,我建议您根据自定义样式将字典中包含的数据转换为字符串格式。

dlm = ';'
with open('out.txt','w') as file:
bheader = True
for d in data:
#header
shead = list( d.keys() )
if bheader: 
file.write( dlm.join( shead ) + 'n' )
bheader=False
#data
sdata = ['%s'%e for e in d.values() ]
file.write( dlm.join(sdata) + 'n' ) 

excel

正如你的评论所暗示的那样,你想在之后将数据导入excel。为了实现这一点,您可以使用excel导入对话框并告诉它使用分隔符""(如上所述(。在您的示例中,您还转换了十进制分隔符;您可以指定"."导入过程中的分隔符或之后在excel中转换整列。

请注意,可能很难访问excel中"神经元"的数组元素。

文件

'in.txt'

{'convolution': 2, 'cov2d_layers': [256, 256], 'fc_layers': 3, 'neurons': [256, 128, 1024], 'optimizer': 'rmsprop'}
Accuracy: 46.63%
{'convolution': 3, 'cov2d_layers': [128, 32, 128], 'fc_layers': 3, 'neurons': [1024, 1024, 1024], 'optimizer': 'adam'}
Accuracy: 39.57%

'out.txt'

convolution;cov2d_layers;fc_layers;neurons;optimizer;accuracy
2;[256, 256];3;[256, 128, 1024];rmsprop;46.63%
3;[128, 32, 128];3;[1024, 1024, 1024];adam;39.57%

低于

import json
import ast
log_lines = []
headers = None
with open('data.txt') as f:
lines = [l.strip() for l in f.readlines()]
for idx, l in enumerate(lines, 1):
if idx % 2 != 0:
d = ast.literal_eval(l)
if not headers:
headers = list(d.keys())
headers.append('accuracy')
else:
d['accuracy'] = l[l.rfind(' '):]
log_lines.append(list(d.values()))
with open('log.txt', 'w') as f:
f.write(';'.join(headers) + 'n')
for line in log_lines:
line = [str(x) for x in line]
f.write(';'.join(line) + 'n')

data.txt

{'convolution': 2, 'cov2d_layers': [256, 256], 'fc_layers': 3, 'neurons': [256, 128, 1024], 'optimizer': 'rmsprop'}
Accuracy: 46.63%
{'convolution': 3, 'cov2d_layers': [128, 32, 128], 'fc_layers': 3, 'neurons': [1024, 1024, 1024], 'optimizer': 'adam'}
Accuracy: 39.57%

log.txt

convolution;cov2d_layers;fc_layers;neurons;optimizer;accuracy
2;[256, 256];3;[256, 128, 1024];rmsprop; 46.63%
3;[128, 32, 128];3;[1024, 1024, 1024];adam; 39.57%

最新更新