2016-09-27 58 views
1

我已經記錄了包含各種垃圾以及有用數據的文件。 我被某些模式匹配和提取的一些信息能夠按以下格式,而在蟒蛇讀取文件一行一行地一些應用得到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,它呈現元一套,右各斌,斌工作現在它基本上是很多重複的工作,同樣的工作再次出現了一組不同的值,例如工作#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,「['30 0.86' , '30.86' ,, '99.0', '1099' ,,]由於必須有4個箱工作,現在它將所有的值作爲一個大的列表,而不是分成4個或4個分檔,或者是否有任何方式在當前的邏輯中做到這一點?

+1

你可以使用像[在其在文檔實例(https://docs.python.org/3/library/collections.html#defaultdict-examples),但你的字典可以包含每一個字典一個defaultdict工作名稱作爲關鍵。最後你會得到一個字典,其中爲每個職位名稱,你會發現一個字典,其中包含每個bin的出現值。然後你可以用你選擇的格式輸出它(但是csv可能不起作用,因爲你的行有不同數量的列)。 –

+0

關於你的更新:你肯定已經破壞了語法,請修復。 –

+0

你在這裏看,我即將放棄這個邏輯,但不知道如何解決問題,那麼:( – Naumann

回答

2

把IO的問題放在一邊,您可以使用defaultdict物流或者defaultdictdefaultdict s精確

你的外部字典可以有對應於作業名稱的鍵。每個作業名稱的值都是一個字典本身,其中鍵對應於二進制名稱。因此,對於每個作業名稱和密鑰名稱,嘗試將內容附加到內部字典的值。如果箱子已經到了,那麼價值會被追加。如果斌是新的,則使用默認的空列表,並且第一個值追加(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']}} 

您可以看到跨作業和垃圾箱名稱收集的值。您可以根據自己的口味進行寫作,但我不認爲在這種情況下CSV是有意義的。您可能必須使用自己的打印機。

你只需要遍歷logs第一,這會給你唯一的作業名稱(鍵),然後在每個區間爲給定的工作循環,然後打印值的列表:

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

這是我們所期望的。

+1

真棒,真的在這裏做的伎倆...... +1肯定 – Naumann

+0

@Naumann我很高興我可以幫助:)如果我的答案適合你,請考慮[標記爲已接受](http://stackoverflow.com/help/accepted-answer)。 –

+1

哦對不起我莫名其妙錯過了前面,只是做到了...再次感謝和歡呼聲 – Naumann