python - чтение файла из определенных строк текста
Я не говорю о конкретных номерах строк, потому что я читаю несколько файлов в одном и том же формате, но разной длины.
Скажи, у меня есть этот текстовый файл:
Something here...
... ... ...
Start #I want this block of text
a b c d e f g
h i j k l m n
End #until this line of the file
something here...
... ... ...
Я надеюсь, вы понимаете, о чем я. я думал об итерации по файлу, затем поиск с использованием регулярного выражения, чтобы найти номер строки "Начало" и "Конец", а затем с помощью linecache для чтения от строки начала до конца строки. Но как получить номер строки? какую функцию я могу использовать?
4 ответа
Если вы просто хотите блок текста между Start
а также End
, вы можете сделать что-то простое, как:
with open('test.txt') as input_data:
# Skips text before the beginning of the interesting block:
for line in input_data:
if line.strip() == 'Start': # Or whatever test is needed
break
# Reads text until the end of the block:
for line in input_data: # This keeps reading the file
if line.strip() == 'End':
break
print line # Line is extracted (or block_of_lines.append(line), etc.)
Фактически вам не нужно манипулировать номерами строк, чтобы считывать данные между маркерами начала и конца.
Логика ("читать до…") повторяется в обоих блоках, но она достаточно ясна и эффективна (другие методы обычно включают проверку некоторого состояния [до того, как блок / в пределах блока / конец блока достигнут), что влечет за собой временную потерю).
Вот что будет работать:
data_file = open("test.txt")
block = ""
found = False
for line in data_file:
if found:
block += line
if line.strip() == "End": break
else:
if line.strip() == "Start":
found = True
block = "Start"
data_file.close()
Вы можете использовать регулярные выражения довольно легко. Вы можете сделать его более надежным по мере необходимости, ниже приведен простой пример.
>>> import re
>>> START = "some"
>>> END = "Hello"
>>> test = "this is some\nsample text\nthat has the\nwords Hello World\n"
>>> m = re.compile(r'%s.*?%s' % (START,END), re.S)
>>> m.search(test).group(0)
'some\nsample text\nthat has the\nwords Hello'
Это должно быть началом для вас:
started = False
collected_lines = []
with open(path, "r") as fp:
for i, line in enumerate(fp.readlines()):
if line.rstrip() == "Start":
started = True
print "started at line", i # counts from zero !
continue
if started and line.rstrip()=="End":
print "end at line", i
break
# process line
collected_lines.append(line.rstrip())
enumerate
генератор берет генератор и перечисляет итерации. Например.
print list(enumerate("a b c".split()))
печать
[ (0, "a"), (1,"b"), (2, "c") ]
ОБНОВЛЕНИЕ:
автор попросил использовать регулярное выражение для сопоставления строк типа "===" и "======":
import re
print re.match("^=+$", "===") is not None
print re.match("^=+$", "======") is not None
print re.match("^=+$", "=") is not None
print re.match("^=+$", "=abc") is not None
print re.match("^=+$", "abc=") is not None