我在优化这部分代码时遇到了一些麻烦。
它有效,但似乎不必要慢。
该函数在从searchString
行开始的文件中line_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
我在these行尝试了一些东西,但从未设法实现“在特定行号上开始” - 输入。
编辑:用例。我发布了包含文本和数字的处理分析文件,这些文件和数字被分成带有标题的不同部分。 line_nr上的标头用于分解数据块以供进一步处理。
电话示例:
startOnLine = searchStr(fileName,'Header 1',1,10000000): endOnLine = searchStr(fileName,'Header 2',startOnLine,10000000):
答案 0 :(得分: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
答案 1 :(得分:0)
我想你的文件是这样的:
Header1 data11 data12 data13..
name1 value1 value2 value3...
...
...
Header2 data21 data22 data23..
nameN valueN1 valueN2 valueN3..
...
'Header'字符串是否包含任何常量格式(即:全部以'#'或sth开头)。如果是这样,你可以直接读取该行,判断该行是否包含这种格式(即:如果行[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):
...