簡體   English   中英

在python中解析大文件的多行,將它們存儲在列表中

[英]Parse multiple lines of a large file in python, store them in lists

下面的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]是整數。

嘗試使用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使函數成為生成函數 ,這意味着在開始循環之前它不會做任何工作。

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

暫無
暫無

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

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