我记录了包含各种垃圾和有用数据的文件。 我通过匹配某些模式来提取一些信息,并且能够在python中逐行读取文件并应用一些if语句时获得以下格式
job id: job#33ABC
Bin 1:30.86
Bin2: 30.86
job id: job#44BC
Bin1: 27.22
Bin2: 8.53
Bin3: 35.75
job id: job#65A
Bin2: 17.135075
Bin4: 17.135120
job id: job#P17
Bin 3: 7.328211
Bin 4: 15.918724
现在问题是具有相同作业ID(具有不同值)的相同日志集重复
job id: job#33ABC
Bin1: 99
Bin2: 1099
...
...
...
如果在表格格式的文件/ csv中有一些聪明的写法方式,只需查看job_id,它就会显示每组的所有Bin1,Bin2作业,现在它基本上是很多重复,同样的工作来了再次使用一组不同的值,例如作业#33ABC,使用不同的值保持10,11次
job_id bin 1, bin2, bin3,bin4
set#1 set #2 set #3
job#33ABC 30.86, 30.86, 0, 0 30.86, 30.86, 0,0
job#44BC 27.22, 8.53, 35.75, 0 0,0,0,34.56
....
...
我逐行阅读该日志
for line in input_file:
if job_name in line:
<extract job_name logic>
print job_name[0]
if 'bin1 matches'
bin1[0]=<all logic>
print "bin1",
bin1[0]
..
...
UPDATE 我尝试使用像
这样的词典records{}
for line in input_file:
if job_name in line:
<extract job_name logic>
print job_name[0]
if 'bin1 matches'
bin1[0]=<all logic>
print "bin1",
bin1[0]
records[job_name[0]]=records.get(job_name[0],[])+[bin1[0]]
if 'bin2 matches'
...
..
records[job_name[0]]=records.get(job_name[0],[])+[bin2[0]]
for key, value in records.items():
writer.writerow([key, value])
但它以下列格式呈现;
33ABC, " ['30.86','30.86','99.0','1099' ]
我的问题是如何识别和呈现 33ABC,&#34; [&#39; 30.86&#39;,&#39; 30.86&#39; ,,&#39; 99.0&#39;,&#39; 1099&#39; ,,]因为必须有4个工作箱子,现在它把所有的值都作为一个大的列表,而不是分成4个,4个箱子,或者在当前逻辑中有没有办法做到这一点?
答案 0 :(得分:2)
将IO问题放在一边,您可以使用defaultdict
进行简单的物流。或者defaultdict
defaultdict
来确切。
您的外部词典可以包含与作业名称对应的键。每个作业名称的值是一个dict本身,其键对应于bin名称。因此,对于每个作业名称和键名,您尝试将元素附加到内部字典的值。如果bin已经出现,则会附加值。如果bin是new,则使用默认的空列表,并附加第一个值(只需要defaultdict
s,以避免一直测试现有的键):
from collections import defaultdict
logs = defaultdict(lambda: defaultdict(list))
# simulate the following input stream:
#
# job1:
# bin1: val1
# bin1: val2
# bin2: val3
#
# job2:
# bin2: val4
#
# job1:
# bin1: val5
logs['job1']['bin1'].append('val1')
logs['job1']['bin1'].append('val2')
logs['job1']['bin2'].append('val3')
logs['job2']['bin2'].append('val4')
logs['job1']['bin1'].append('val5')
# see what we've got, converted to a non-default dict for prettiness
print({k:dict(logs[k]) for k in logs})
这将返回
{'job1': {'bin1': ['val1', 'val2', 'val5'], 'bin2': ['val3']}, 'job2': {'bin2': ['val4']}}
您可以看到在作业和bin名称之间收集值。您可以根据自己的喜好进行写作,但我不认为CSV在这种情况下有意义。您可能必须使用自己的打印机。
首先必须循环logs
,这将为您提供唯一的作业名称(键),然后循环遍历给定作业的每个bin,然后打印值列表:
for lkey in logs:
# lkey is a job name, logs[lkey] is a defaultdict
print(lkey)
for bkey in logs[lkey]:
# logs[lkey][bkey] is a list of values which you can print
print(bkey)
print(logs[lkey][bkey])
以上的输出是
job1
bin1
['val1', 'val2', 'val5']
bin2
['val3']
job2
bin2
['val4']
这是我们所期望的。