在python中解析大文件的多行,将它们存储在列表中

时间:2015-09-24 05:02:21

标签: python

下面的python代码:

pkts=rdpcap("abcFile.pcap",100)

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)

with open("filenameTEST", 'w') as f:
    for i in parsePcap():
        f.write("%s,%s,%d\n" % i)

并在文件filenameTEST中保存响应:

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
58.20.154.23,0.191.51.126,17
68.249.101.222,0.62.29.118,6

我想将前两个值(一个列表中的字符串)和最后一个整数存储在一个单独的列表中:

attribute = []
nodePairs = []
with open("filenameTEST") as f:
    while(True):
        myArr = [b.split(',') for b in f.readline().split()]
        for i in myArr:
            attribute.append((i[0],i[1],i[2])) 
            nodePairs.append((i[0],i[1]))

代码的最后一段是不正确的,但我需要的是两个列表 属性为列表,其中包含所有3个值和nodepairs作为每行的前两个值。此外,i[2]是一个整数。

1 个答案:

答案 0 :(得分:3)

尝试使用csv模块可以更轻松地解决此问题。

不要将所有行读入列表

在生成行时处理它们。如果您需要首先过滤数据,请使用生成器函数:

import csv

def getstuff(filename, criterion):
    with open(filename, "rb") as csvfile:
        datareader = csv.reader(csvfile)
        count = 0
        for row in datareader:
                yield row

您现在只在内存中保留一行,而不是数千行。

yield将函数设为generator function,这意味着在您开始循环之前,它不会做任何工作。

这也可能有所帮助:http://lethain.com/handling-very-large-csv-and-xml-files-in-python/