在解析 python 中的文件时,在一系列行中执行一些操作

While parsing a file in python do some operation in a range of line

我正在 python 中读取 15GB 的文件,我的代码如下所示:

infile = open(file, "r")
count=0
line = infile.readline()
num_lines = int(sum(1 for line in open(file)))
while line:
     if count%2==0:
            if count>num_lines:
                break
            fields=line.split(";")
            tr=int(fields[0].split(",")[1])
            for ff in fields[1:]:
                ffsplit=ff.split(",")
                address=int(ffsplit[0])
                amount=int(ffsplit[1])
                if address not in add_balance.keys():
                    add_balance[address]=-amount
                else:
                    add_balance[address]-=amount
                if address not in de_send.keys():
                    de_send[address]=1
                else:
                    de_send[address]+=1
        else:
            fields=line.split(";")
            for ff in fields:
                ffsplit=ff.split(",")
                address=int(ffsplit[0])
                amount=int(ffsplit[1])
                if address not in add_balance.keys():
                    add_balance[address]=amount
                else:
                    add_balance[address]+=amount
                if address not in de_rec.keys():
                    de_rec[address]=1
                else:
                    de_rec[address]+=1
    count+=1
    line=infile.readline()

现在,当 tr 在某个范围内([100000,200000],[200000,300000] 等等)时,我需要在该范围内创建一个 networkX 图(添加范围内的 tr 和地址作为节点)并在更新词典的同时进行一些其他操作。

tr 就像一个索引,所以从每两行 1 开始(这就是 count%2==0 的原因)增加 1

我试图创建一个 def createGraph,它在读取文件时也会在该范围内创建节点。我的问题是,每次我创建图表时,我都会从头开始读取文件,所以显然它的计算效率不高。

我如何从某个 tr(比如说 100000)开始在 whlie 子句中每 100000 tr 创建一个图表?

如果文件永远不会改变,您可以使用 .tell 预先计算所需行的位置,然后使用 .seek 方法移动到该行并从那里开始工作

>>> with open("test.txt","w") as file: #demostration file
        for n in range(10):
            print("line",n,file=file)

>>> desire_line=4
>>> position_line=0
>>> with open("test.txt") as file: #get the line position
        for i,n in enumerate(iter(file.readline,"")):
            if i==desire_line:
                break
        position_line=file.tell()

>>> with open("test.txt") as file:
        file.seek(position_line)
        for line in file:
            print(line)

    
40
line 5

line 6

line 7

line 8

line 9

>>> 

如果文件确实发生了变化,特别是在您想要的点之前的行中,这会弄乱查找,您可以使用 itertools 模块来帮助您到达那里

>>> import itertools
>>> with open("test.txt") as file:
        for line in itertools.islice(file,5,None):
            print(line)

    
line 5

line 6

line 7

line 8

line 9

>>> 

如需更多选择,请查看此 answer