1

我在优化这部分代码时遇到了一些麻烦。它有效,但似乎不必要的慢。该函数searchString在从 line 开始的文件中搜索 aline_nr并返回第一次命中的行号。

import linecache
def searchStr(fileName, searchString, line_nr = 1, linesInFile):
# The above string is the input to this function 
# line_nr is needed to search after certain lines.
# linesInFile is total number of lines in the file.

    while line_nr < linesInFile + 1:
        line = linecache.getline(fileName, line_nr)
        has_match = line.find(searchString)
        if has_match >= 0:
            return line_nr
            break
        line_nr += 1

我已经尝试过这些方面的东西,但从未设法实现“从某个行号开始”输入。

编辑:用例。我正在对包含文本和数字的分析文件进行后期处理,这些文本和数字被拆分为带有标题的不同部分。line_nr 上的标头用于拆分数据块以进行进一步处理。

调用示例:

startOnLine = searchStr(fileName, 'Header 1', 1, 10000000): endOnLine = searchStr(fileName, 'Header 2', startOnLine, 10000000):

4

2 回答 2

1

为什么不从最简单的实现开始呢?

def search_file(filename, target, start_at = 0):
    with open(filename) as infile:
        for line_no, line in enumerate(infile):
            if line_no < start_at:
                continue
            if line.find(target) >= 0:
                return line_no
    return None
于 2013-11-13T10:48:37.180 回答
0

我猜你的文件是这样 Header1 data11 data12 data13.. name1 value1 value2 value3... ... ... Header2 data21 data22 data23.. nameN valueN1 valueN2 valueN3.. ... 的:'Header' 字符串是否包含任何常量格式(即:全部以'#' 或 sth 开头)。如果是,你可以直接读取该行,判断该行是否包含这种格式(即:if line[0]=='#')并为不同类型的行编写不同的代码(示例中的定义线和数据线) .

记录类:

class Record:
   def __init__(self):
       self.data={}
       self.header={}
   def set_header(self, line):
       ...
   def add_data(self, line):
       ...

迭代部分:

def parse(p_file):
   record = None
   for line in p_file:
      if line[0] == "#":
         if record : yield record
         else:
           record = Record()
           record.set_header(line)
      else:
         record.add_data(line)
   yield record

主要功能:

data_file = open(...)
for rec in parse(data_file):
    ...
于 2013-11-13T12:08:03.510 回答