Python - чтение нескольких строк в список

1

ОК ребята /gals снова застряли на чем-то простом
У меня есть текстовый файл с несколькими строками на запись, данные в следующем формате

слово слово слово слово
wordx слово слово слово интересный1 слово слово слово слово
Слово слово слово слово
слово слово слово слово интересно2 слово слово слово слово

эта последовательность повторяется сотню раз, все остальные слова одинаковы, кроме интересных1 и интересных2, без пустых строк. Интересное2 уместно для интересного1, но ни для чего другого, и я хочу связать два интересных предмета вместе, отбросив остальных, например

interesting1 = interesting2
interesting1 = interesting2
interesting1 = interesting2
и т.д., 1 lne per sequence

Каждая строка начинается с другого слова моя попытка состояла в том, чтобы прочитать файл и выполнить оператор "if wordx in line", чтобы идентифицировать первую интересную строку, отрезать значение, найти вторую строку ( "если wordz в строке" ) срезать значение и объединить второе с первый.
Это было неуклюже, хотя я должен был использовать глобальные переменные, временные переменные и т.д., И я уверен, что должен быть способ определить диапазон между первым словом и словом и помещать его в один список, а затем вырезать оба значения вместе.

Любые предложения с благодарностью признаны, спасибо за ваше время

  • 4
    Может помочь, если у вас есть пример кода. Трудно сказать, как вы ожидаете определить, что «интересно». Всегда ли это в индексе 4?
  • 2
    Как говорит Монкут, вы пытались слишком упростить вещи для этого вопроса, и это, к сожалению, очень затруднило понимание того, что или почему вы хотели бы делать, как это звучит. Не бойтесь включать некоторые реальные данные, чтобы мы могли видеть, что происходит.
Показать ещё 2 комментария
Теги:
text
parsing
line

3 ответа

6
from itertools import izip, tee, islice

i1, i2 = tee(open("foo.txt"))

for line2, line4 in izip(islice(i1,1, None, 4), islice(i2, 3, None, 4)) :
    print line2.split(" ")[4], "=", line4.split(" ")[4]
0

В этом случае создайте регулярное выражение, которое соответствует повторяющемуся тексту, и имеет группы для интересных битов. Затем вы сможете использовать findall для поиска всех интересных и интересных интересных случаев.

Так же:   import re

text = open("foo.txt").read()
RE = re.compile('firstword.*?wordx word word word (.*?) word.*?wordz word word word (.*?) word', re.DOTALL)
print RE.findall(text)

Хотя, как упоминалось в комментариях, islice определенно является более аккуратным решением.

  • 0
    Предположим, вы имеете в виду регулярное выражение в стиле re.VERBOSE с четырьмя строками, со второй строкой что-то вроде \ s * wordx \ S + \ s + \ S + \ s + \ S + \ s + (\ S +) \ s + \ S + \ s + \ S + \ s + \ S + \ s + \ S + \ s * \ n ... ОП может понадобиться немного помочь с этим. Разъяснение этого с небольшим количеством объяснений и как настроить это должно дать вам по крайней мере один голос ;-)
  • 0
    Эх ... нет, вам нужно только регулярное выражение, которое фактически соответствует рассматриваемому тексту, но не соответствует его частям или нескольким повторениям. Я не вижу необходимости в том, чтобы четыре строки содержали длинные строки в \ s + ... В любом случае, islice - лучшее решение. Тем не менее, я обновил его с полным решением.
0

Я бросил в сумку утверждения, чтобы проверить правильность расположения ваших данных.

C:\SO>type words.py

# sample pseudo-file contents
guff = """\
firstword word word word
wordx word word word interesting1-1 word word word word
wordy word word word
wordz word word word interesting2-1 word word word lastword

miscellaneous rubbish

firstword word word word
wordx word word word interesting1-2 word word word word
wordy word word word
wordz word word word interesting2-2 word word word lastword
firstword word word word
wordx word word word interesting1-3 word word word word
wordy word word word
wordz word word word interesting2-3 word word word lastword

"""

# change the RHS of each of these to reflect reality
FIRSTWORD = 'firstword'
WORDX = 'wordx'
WORDY = 'wordy'
WORDZ = 'wordz'
LASTWORD = 'lastword'

from StringIO import StringIO
f = StringIO(guff)

while True:
    a = f.readline()
    if not a: break # end of file
    a = a.split()
    if not a: continue # empty line
    if a[0] != FIRSTWORD: continue # skip extraneous matter
    assert len(a) == 4
    b = f.readline().split(); assert len(b) == 9
    c = f.readline().split(); assert len(c) == 4
    d = f.readline().split(); assert len(d) == 9
    assert a[0] == FIRSTWORD
    assert b[0] == WORDX
    assert c[0] == WORDY
    assert d[0] == WORDZ
    assert d[-1] == LASTWORD
    print b[4], d[4]

C:\SO>\python26\python words.py
interesting1-1 interesting2-1
interesting1-2 interesting2-2
interesting1-3 interesting2-3

C:\SO>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню