python,存储重复条目的智能方式

时间:2016-09-27 21:55:26

标签: python file dictionary text

我记录了包含各种垃圾和有用数据的文件。 我通过匹配某些模式来提取一些信息,并且能够在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个箱子,或者在当前逻辑中有没有办法做到这一点?

1 个答案:

答案 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']

这是我们所期望的。