我有一个逐行读取大型.txt文件的函数。
作为参数,我向函数提供了应该从文件中开始读取的行索引。
首先我用0调用该函数,使其从头开始。 最后,我再次使用一个新参数调用该函数,但是当它在函数中重新进入时,新发送的索引(现在不同)在for语句中仍为0。 :(
from __future__ import print_function
import os
import sys
file = open("file.txt").read().splitlines()
for i, line in enumerate(file):
if file[i] == "@@@TC_FIN@@@":
fin = i;
#print (fin)
def AssembleTC(index):
while index < fin:
for index, line in enumerate(file):
if "@@@ ID:" in line:
print(file[index+1])
break
for index, line in enumerate(file):
if file[index] == "@@@TC_FIN@@@":
recursive = index;
#print (recursive)
break
AssembleTC(recursive+1)
AssembleTC(0)
对于我来说,使用文件[索引]访问过程保留当前语句至关重要。我已经读过,我可以跳过file.next()
之类的行,但它不起作用。
有没有办法跳过我想要的行数或只是从更新的索引开始新的读取? Python 2.7.13 - 谢谢!
答案 0 :(得分:1)
它是一个大文本文件,所以我认为值得重新审视逐行阅读它的想法。文件对象会跟踪它们在文件中的位置,因此可以在内部重新启动它们以进行其他处理。生成器使用yield将结果传递给调用者,这是封装功能的好方法。
此示例扫描文件,直到它看到ID,收集行,直到它看到FIN,然后将数据交还给调用者。它是一个生成器,因此可以从for循环中调用它来依次获取所有记录。
from __future__ import print_function
import os
import sys
def my_datablock_iter(fileobj):
for line in file:
# find ID
if "@@@ ID:" in line:
# build a list of lines until FIN is seen
wanted = [line.strip()]
for line in file:
line = line.strip()
if line == "@@@TC_FIN@@@":
break
wanted.append(line)
# hand block back to user
yield wanted
with open("file.txt") as fp:
for datablock in my_datablock_iter(fp):
print(datablock)
答案 1 :(得分:0)
我已经通过删除我已经解析过的行来实现我的想法,并且效果非常好,但这只是我喜欢的情况,因为我不再需要任何我操作过的数据了。 对于那些仍然需要它的人,我认为@tdelaney代码很好用,回答我感谢他!
我是这样做的:
from __future__ import print_function
import os
import sys
initialCall = os.stat("test.txt").st_size
def AssembleTC(parameter):
print("CALLED PARAMETER = " + str(parameter))
if parameter == 0:
sys.exit()
else:
file = open("test.txt").read().splitlines()
for index, line in enumerate(file):
if file[index] == "@@@TC_FIN@@@":
fin = index;
print ("FIN POSITION = " + str(fin))
break
check = os.stat("test.txt").st_size
print("File size = " + str(check))
while check > 1:
for index, line in enumerate(file):
if "@@@ TC NR" in line:
print(file[index+1])
break
ok=0
with open("test.txt","r") as textobj:
mylist = list(textobj)
del mylist[0:fin+1]
ok=1
if ok==1:
with open("test.txt", "w") as textobj:
for n in mylist:
textobj.write(n)
print("OLD SIZE = " + str(check))
check = os.stat("test.txt").st_size
print("NEW SIZE = " + str(check) + "\n")
AssembleTC(check)
AssembleTC(initialCall)