如何从某一行的文件开始读取?

时间:2017-03-22 22:43:56

标签: python python-2.7

我有一个逐行读取大型.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 - 谢谢!

2 个答案:

答案 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)