在解析 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
我正在 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