Python - чтение нескольких строк в список - PullRequest
1 голос
/ 30 июня 2009

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

первое слово слово слово слово
слово слово словослово интересно1 слово слово слово слово
слово слово слово слово
слово слово слово слово интересно2 слово слово слово последнее слово

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

интересно1 = интерес2
интерес1 = интерес2
интерес1 = интерес2
etc, 1 lne за последовательность

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

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

Ответы [ 3 ]

6 голосов
/ 30 июня 2009
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 голосов
/ 30 июня 2009

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

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>
0 голосов
/ 30 июня 2009

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

Вроде так: импорт ре

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)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...