1

好的,伙计们/女孩们再次停留在简单的事情上
我有一个文本文件,每个条目有多行,数据采用以下格式

第一个词 词 词 词 词
x 词 词 词有趣1词 词 词 词 词 词 词 词

词 词 词有趣2词 词 词

这个序列重复了一百次左右,除了interesting1和interesting2之外所有其他单词都相同,没有空行。有趣的 2 与有趣的 1 相关,但与其他任何东西无关,我想将这两个有趣的项目链接在一起,丢弃其余的,例如

有趣 1 = 有趣2
有趣 1 = 有趣2
有趣 1 = 有趣
2 等等,每个序列 1 个 lne

每行以不同的单词开头
我的尝试是读取文件并执行“if wordx in line”语句来识别第一个有趣的行,切出值,找到第二行,(“if wordz in line)切出值并将第二个与第一个连接起来。
虽然很笨拙,我不得不使用全局变量、临时变量等,而且我确信必须有一种方法来识别 firstword 和 lastword 之间的范围并将其放入单个列表中,然后将两个值切分在一起。

任何建议都非常感谢,感谢您的时间

4

3 回答 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]
于 2009-06-30T07:46:01.103 回答
0

在这种情况下,制作一个匹配重复文本的正则表达式,并为有趣的位设置组。然后你应该可以使用 findall 找到所有有趣的 1 和有趣的 2 的情况。

像这样: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 绝对是一个更整洁的解决方案。

于 2009-06-30T07:20:54.493 回答
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>
于 2009-06-30T08:08:57.063 回答