[英]How do I Sum Dictionary in Python and Sort by Key Value
我有一個凈流數據的日志文件,該文件試圖按IP地址和時間戳進行排序並添加字節。 因此,它需要按字節數降序列出相同的IP地址。
該文件的輸出為:
Min Source IP Bytes
./R2snd/2014/02/02/02/25.flows:100.000.000.000 | 101.101.101.101 | 0 | 4 | 3 | 2 | 96 | 1391336665 | 1391336668 | 3361 | 445 | 2 | 6 | 0 | 0 | 0 | 0 | 0
由於某種原因,我只能顯示分鍾,但是我需要格式化整個時間和日期。 分鍾是我在其上方輸入分鍾的最后一個數字。 然后,我需要它獲取文件中的每個ip地址,並按ip對其進行排序,這樣重復的ip就會一起出現,並添加每個ip發送的字節。 我試圖在下面用字典來做到這一點,但是我似乎無法使它正常工作。 然后,我需要按字節降序對字典進行排序,因為對於每個ip條目,它都需要添加字節,因此,每個ip的最高條目將是該ip發送的總字節數。
import operator
with open('/home/username/Documents/log') as f:
for line in f:
#save the data into an array
firstsplitforminute = line.split('/')
secondsplitforminute = firstsplitforminute[6].split('.')
firstsplitforsourceip = line.split('|')
secondsplitforsourceip = firstsplitforsourceip[0].split(':')
minute = secondsplitforminute[0]
sourceip = secondsplitforsourceip[1]
bytes = line.split('|')[6]
protocol = line.split('|')[12]
if protocol == '6':
entries = {'IP':sourceip, 'BYTES':bytes, 'MIN':minute}
sum(item['BYTES'] for item in entries)
def sortbykey():
sortedbykeydict = sorted(entries.items(), key = lambda t: t[1])
print sortedbykeydict
sortbykey()
else:
pass
但是,運行此代碼時出現以下錯誤:
File "/home/grant/.eclipse/org.eclipse.platform_3.8_155965261/plugins/org.python.pydev_3.4.1.201403181715/pysrc/pydevd.py", line 1844, in <module>
debugger.run(setup['file'], None, None)
File "/home/grant/.eclipse/org.eclipse.platform_3.8_155965261/plugins/org.python.pydev_3.4.1.201403181715/pysrc/pydevd.py", line 1372, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "/home/grant/workspace/Learning/LogfileExtractor.py", line 16, in <module>
sum(item['BYTES'] for item in entries)
File "/home/grant/workspace/Learning/LogfileExtractor.py", line 16, in <genexpr>
sum(item['BYTES'] for item in entries)
TypeError: string indices must be integers, not str
嘗試解析: 'BYTES':int(bytes)
(據我了解,您的代碼應該可以正常工作)
@BartoszKP是正確的。 Python正在遍歷entries
,這不會導致字符串:
entries = {'IP':sourceip, 'BYTES':bytes, 'MIN':minute}
sum(item['BYTES'] for item in entries)
相反,您應該“指定”字典:
sum(v for k,v in entries.items())
這意味着在第一次迭代中, 'IP'
存儲在k
, sourceip
存儲在v
; 第二個, 'BYTES'
存儲在k
, bytes
存儲在v
; 等等...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.