Оптимизация поиска файлов Python?
У меня возникли проблемы с оптимизацией этой части кода. Это работает, но кажется ненужным медленно. Функция ищет после 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
Я пробовал что-то в этом духе, но так и не смог реализовать ввод "начать с определенного номера строки".
Изменить: случай использования. Я занимаюсь пост-обработкой файлов анализа, содержащих текст и цифры, которые разбиты на разные разделы с заголовками. Заголовки в line_nr используются для разделения фрагментов данных для дальнейшей обработки.
Пример звонка:
startOnLine = searchStr (имя файла, "Заголовок 1", 1, 10000000): endOnLine = searchStr(имя файла, "Заголовок 2", startOnLine, 10000000):
2 ответа
Почему бы вам не начать с самой простой реализации?
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
Я думаю, что ваш файл похож на:
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):
...