【问题标题】:How to print the number of unique values in a dictionary colomn and add values in a column如何打印字典列中唯一值的数量并在列中添加值
【发布时间】:2014-11-25 11:41:36
【问题描述】:

我必须读取一个名为 IPconnections.csv 的 csv 文件,该文件有 147 行这样的

#Src IP,Dest IP, Length (Bytes)
192.168.50.170, 172.16.4.240,60
172.16.4.240, 192.168.50.170,58
192.168.50.170, 172.16.4.240,60
192.168.50.170, 172.16.4.240,471
172.16.4.240, 192.168.50.170,54

并在 Dest IP 或 Src IP 字段中打印唯一条目的数量。

基本上,我想知道捕获文件中涉及哪些 IP 地址。之后,我想知道每对 IP 地址中传输的字节数。

我不知道数据结构和 python。请帮忙。

我的代码:

import csv

f=csv.DictReader(open("IPconnections.csv",'r'))
s=set(val for dic in f for val in dic.values())
set([f])
n=0
for row in f:
    print row
    n=n+1

print "total rows are %d" %(n)
print "unique rows are %d" %len(s)

DictReader 是这样读的:

{
    'Dest IP': '172.16.4.240', 
    'Length (Bytes)': '60', 
    '#Src IP': '192.168.50.170'
}

【问题讨论】:

  • 我从上述 csv.DictReader 的打印输出中复制粘贴了这一行。这是它在记事本中的样子:#Src IP,Dest IP, Length (Bytes) 192.168.50.170, 172.16.4.240,60 172.16.4.240, 192.168.50.170,58 192.168.50.170, 172.16.4.240.50.60 10,2.16 172.16.4.240,471 172.16.4.240, 192.168.50.170,54

标签: python-2.7 csv


【解决方案1】:

您的代码存在一些问题:

  • 这里真的不需要DictReader(事实上,它只会让事情变得更复杂);此外,在这种情况下,第一行可能不应该以 # 开头
  • s 不仅会保存唯一的 IP 地址,还会保存唯一的传输字节数
  • 如果不将其分配给某个变量,set([f]) 不会做任何有用的事情
  • 创建s后,f读卡器被耗尽,所以for row in f:根本不执行

如果您想找到唯一的 IP 地址并总结每对此类地址之间传输的字节数(从您的问题和代码中不完全清楚),您可以尝试以下操作:

import csv, collections

with open("IPconnections.csv") as f:
    r = csv.reader(f, skipinitialspace=True)    # regular reader, strip spaces
    next(r)                                     # skip header row
    ips = set()                                 # holds unique IPs
    transferred = collections.defaultdict(int)  # holds sums of transf. bytes
    for src, tgt, transf in r:
        ips.add(src)                            # add to unique IPs
        ips.add(tgt)
        transferred[(src, tgt)] += int(transf)  # add to transferred
    print ips
    print transferred

输出:

set(['192.168.50.170', '172.16.4.240'])
defaultdict(<type 'int'>, {('172.16.4.240', '192.168.50.170'): 112, 
                           ('192.168.50.170', '172.16.4.240'): 591})

附录,以前在 cmets 中:

  • 如果要合并两个 IP 地址之间双向传输的字节,请使用 transferred[frozenset([src, tgt])] += int(transf)
  • 如果您在使用skipinitialspace 的情况下仍遇到 IP 地址周围的空格问题,请在循环顶部添加 src, tgt = src.strip(), tgt.strip()

【讨论】:

  • 它就像我想要的我共享的 csv 文件的一部分一样工作。我在我的 csv 文件上运行它,如下所示:#Src IP,Dest IP, Length (Bytes) #Src IP,Dest IP, Length (Bytes) 192.168.50.170, 172.16.4.240,60 172.16.4.240, 192.168.50.170 ,58 192.168.50.170, 172.16.4.240,60 192.168.50.170, 172.16.4.240,471 172.16.4.240, 192.168.50.170,54 172.16.4.240, 172.16.4.52,238 172.16.4.52, 172.16.4.240,133 172.16.4.240 , 172.16.4.52,723 172.16.4.52, 172.16.4.240,89 172.16.4.240, 172.16.4.52,89 等等。它为这些打印重复的地址。
  • 这是我的输出:set(['172.16.4.52', '172.16.4.240', '172.16.4.52', '192.168.50.170', '172.16.4.240', '172.16.4.240 ', '172.16.4.52', '172.16.4.52', '172.16.4.240', '172.16.4.52', '172.16.4.240', '172.16.4.52', '192.168.50.170']) int'>,{frozenset(['172.16.4.52','172.16.4.240']):60,frozenset(['192.168.50.170','172.16.4.240']):5641,frozenset(['172.16.4.52 ','172.16.4.240']):440,frozenset(['172.16.4.52','172.16.4.240']):641,frozenset(['172.16.4.52','172.16.4.240']):60, freezeset(['172.16.4.240', '172.16.4.52']): 60,
  • frozenset(['172.16.4.240', '172.16.4.52']): 1514, frozenset(['172.16.4.240', '172.16.4.52']): 1282, frozenset([' 172.16.4.52', '172.16.4.240']): 641, freezeset(['172.16.4.52', '172.16.4.240']): 67867, frozenset(['172.16.4.240', '192.168.50.170']) :591,frozenset(['172.16.4.240','172.16.4.52']):1514,frozenset(['172.16.4.52','172.16.4.240']):3205,frozenset(['172.16.4.52', '172.16.4.240']):1514,frozenset(['192.168.50.170','172.16.4.240']):112,frozenset(['172.16.4.52','172.16.4.240']):60})
  • 我添加了条带功能,它起作用了! set(['172.16.4.52', '192.168.50.170', '172.16.4.240']) defaultdict(, {frozenset(['192.168.50.170', '172.16.4.240']): 6344 , freezeset(['172.16.4.52', '172.16.4.240']): 78858})
  • 抱歉,这是无意的。我已经发布了另一个问题,我在其中捕获了一个 pcap 并转换为 csv,并希望找到 tcp 连接的数量。
猜你喜欢
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 2015-10-03
相关资源
最近更新 更多