Как прочитать строку на несколько строк вниз во время цикла в Python? - PullRequest
1 голос
/ 06 февраля 2012

Мне интересно, есть ли способ в Python 2.7 прочитать текстовый документ для поиска определенных слов, а затем, если он найдет эти слова, он прочтет несколько строк вниз, чтобы найти новое слово.Если он не найдет новое слово, он вернется к поиску первого слова.

Например, мой текстовый документ выглядит так:

1.Section

2. Cheesecake
3. 0
4. 0
5. 0
6. Tastes good
7. 0
8. 0
9. Donut
10. 0
11. Tastes good
12. 0
13. Cheesecake
14. 0
15. 0
16. Tastes bad

Это код, который ядо сих пор:

import sys

fileName = open("filename.txt", "r")

while True:
    line = fileName.readline()
    if line is None: break
    else:
        if line.startswith('CHEESECAKE'):
            print (line)
            x = raw_input(" Continue? ")
            if x == "n":
                sys.exit()

Я не знаю, что делать с этого момента!Как я могу заставить его искать чизкейки, а затем проверять их вкус?

Ответы [ 4 ]

1 голос
/ 06 февраля 2012

Попробуйте что-нибудь в этом духе ....

 if line.startswith('CHEESECAKE'):
       do something
     elseif line.startswith('tastegood'):
     do something
 else:
   do something
   print (line)
   x = raw_input(" Continue? ")
   if x == "n":
            sys.exit()
0 голосов
/ 07 февраля 2012

Вы также можете группировать записи от одного ключевого слова к следующему.

import sys</p>

<p>def process_group(list_in):
    if len(list_in):
        for rec in list_in:
            if rec.startswith("Tastes"):
                print "Tastes found for", list_in[0]
                return
        print "Tastes NOT found for", list_in[0]</p>

<p>open_file = open("filename.txt", "r")</p>

<p>group_list=[]
start_list=["CHEESECAKE", "DONUT"]
for line in open_file:
    for st in start_list:
        if line.upper().startswith(st):  ## process this group
            print (line)
            process_group(group_list)
            group_list=[]      ## an empty list for the next group
            x = raw_input(" Continue? ")
            if x == "n":
                sys.exit()
    group_list.append(line)</p>

<p>process_group(group_list)  # process the last group
0 голосов
/ 07 февраля 2012

Использование регулярных выражений:

filecontent = open("filename.txt", "r").read()
results = re.findall('Cheesecake.*?Tastes\s+?(\w*)\s+?', filecontent, re.DOTALL)
print results

Лучший способ поиска шаблонов в файле - это прочитать все сразу за один шаг, за исключением того, что это очень очень длинный файл.Затем вы используете регулярное выражение с флагом re.DOTALL.Это означает, что новые строки обрабатываются как обычные символы, что позволяет шаблону поиска занимать несколько строк.

Если вы хотите, вы можете смешать часть этого с вашим предыдущим кодом, чтобы позволить пользователю выполнить одно совпадение ввремя.Затем вы должны использовать re.search(pattern, text, re.DOTALL).group(1) для получения каждого отдельного совпадения.

0 голосов
/ 06 февраля 2012

Вы можете шагнуть вперед в итераторе строк с помощью чего-то вроде thisline=line.next()

вы также можете продолжить чтение строк в вашем основном цикле с помощью чего-то вроде

for tmp in line:
    if tmp eq "bla" : 
       ... do something.
       break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...