python - чтение файла из определенных строк текста - PullRequest
16 голосов
/ 26 сентября 2011

Я не говорю о конкретных номерах строк, потому что я читаю несколько файлов в одном и том же формате, но разной длины.
Скажите, у меня есть этот текстовый файл:

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 ]

33 голосов
/ 26 сентября 2011

Если вам просто нужен блок текста между 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.)

На самом деле вам не нужно манипулировать номерами строк, чтобы считывать данные между маркерами начала и конца.

Логика («читать до…») повторяется в обоих блоках, но она достаточно ясна и эффективна (другие методы обычно включают в себя проверку некоторого состояния [до того, как блок / в пределах блока / конец блока достигнут), что требует времени штраф).

5 голосов
/ 26 сентября 2011

Вот что будет работать:

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()
3 голосов
/ 27 сентября 2011

Вы можете использовать регулярные выражения довольно легко. При необходимости вы можете сделать его более надежным, ниже приведен простой пример.

>>> 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'
1 голос
/ 26 сентября 2011

Это должно быть началом для вас:

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") ]

UPDATE

автор попросил использовать регулярное выражение для сопоставления строк, таких как "===" и "======":

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
...