簡體   English   中英

如何在Python中匯總字典並按鍵值排序

[英]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'存儲在ksourceip存儲在v 第二個, 'BYTES'存儲在kbytes存儲在v 等等...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM