python - 在 python 中解析大 (.5Gb) pcap 文件

标签 python list file pcap

我有一个很大的 pcap 文件,我正在使用下面的 python 代码对其进行解析。该代码可以工作,但有一个问题。当我解析 pcap 文件时,如下面的代码所示,我将值存储在另一个名为 filename 的文件中

pkts=rdpcap("MyFile.pcap")
def parsePcap():
    IPList = []
    for pkt in pkts:
        if IP in pkt:
            ip_src=pkt[IP].src
            ip_dst=pkt[IP].dst
            ip_proto=pkt[IP].proto
       IPList.append((ip_src,ip_dst,ip_proto))
    return IPList


#parseOutput = parsePcap()

f = open('filename', 'w')
f.write(' '.join(map(str, parsePcap()))) 
f.close()

当我从“文件名”检索值时,问题就出现了。我得到以下输出(下面的确切示例)。但事实并非如此。

('121.14.142.72',
'0.32.59.21',
6,
)
('123.152.135.217',
'0.3.17.121',
17,
)
('71.229.65.158',
'0.48.101.12',
17,
)

当我运行以下代码时 -

uniqueNodePairs=[]

myArr = map(str, open("filename").readline().strip().split())

for i in myArr:
    print i
    uniqueNodePairs.append((i[0],i[1]))# pairs of src., dst

for i in  uniqueNodePairs:
    print i

我得到以下信息 -

('(', "'")
("'", '0')
('6', ')')
('(', "'")
("'", '0')
('1', '7')
('(', "'")
("'", '0')

这意味着值不会存储为字符串,而是单个字符。这不是我想要的。我想要这样的输出

('121.14.142.72','0.32.59.21'),
('123.152.135.217','0.3.17.121'),...

最佳答案

还有一件事要考虑。您的输入文件是 5Gb,因此您可能不应该从 parsePcap() 函数返回列表。由于您对该列表所做的一切都是对其进行迭代,因此最好使用 yield 关键字将您的函数转换为生成器。这是您的原始函数:

def parsePcap():
    IPList = []
    for pkt in pkts:
        if IP in pkt:
            ip_src=pkt[IP].src
            ip_dst=pkt[IP].dst
            ip_proto=pkt[IP].proto
        IPList.append((ip_src,ip_dst,ip_proto))
    return IPList

这是生成器的样子:

def parsePcap():
    for pkt in pkts:
        if IP in pkt:
            ip_src=pkt[IP].src
            ip_dst=pkt[IP].dst
            ip_proto=pkt[IP].proto
        yield (ip_src,ip_dst,ip_proto)
这样,您就不会将整个列表存储在内存中:当每个 src、dst、proto 三元组准备就绪时,它会从函数返回,写入输出文件,然后从内存中处理。

通过使用生成器而不是构建列表并返回它,您将允许自己处理更大的文件。 5Gb 小于大多数现代系统上的 RAM 量,因此输入文件并不是真正的问题 - 但如果您有一个 500Gb 的文件要处理,您会发现生成器版本比构建列表快得多-and-return-it 版本,它将不断地访问交换文件。

关于python - 在 python 中解析大 (.5Gb) pcap 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32535267/

相关文章:

python - 将 token 传递给客户端

python - Python 中的 COM 对象(arcobjects)

python - 迭代 CGI 文件中的列表并打印 html 中的值

list - "::(a,b)"和 "List(a,b)"模式匹配的区别

python - 添加/修改 Pandas DataFrame 的索引

python - 如何将行转换为 Pandas 中的列?

Javascript函数推送问题

file - vim 将通过 CLI 打开的文件添加到 :e history

java - 如果文件不存在,则在创建之前检查文件是否存在

java - 创建文本文件 Java 时出错