Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-将多行读入列表_Python_Text_Parsing_Line - Fatal编程技术网

Python-将多行读入列表

Python-将多行读入列表,python,text,parsing,line,Python,Text,Parsing,Line,好了,小伙子们/姑娘们又在简单的事情上卡住了 我有一个文本文件,每个条目有多行,数据格式如下 第一个字 wordx单词有趣1单词 冗长的单词 wordz单词有趣2最新单词 这个序列重复了大约一百次,除了兴趣1和兴趣2之外,所有其他单词都是相同的,没有空行。兴趣2与兴趣1相关,但与其他任何内容无关,我想将这两个有趣的项目链接在一起,而放弃其他项目,如 兴趣1=兴趣2 兴趣1=兴趣2 兴趣1=兴趣2 etc,每个序列1个lne 每行以不同的单词开头 我的尝试是读取文件并执行“if wordx in

好了,小伙子们/姑娘们又在简单的事情上卡住了
我有一个文本文件,每个条目有多行,数据格式如下

第一个字
wordx单词有趣1单词
冗长的单词
wordz单词有趣2最新单词

这个序列重复了大约一百次,除了兴趣1和兴趣2之外,所有其他单词都是相同的,没有空行。兴趣2与兴趣1相关,但与其他任何内容无关,我想将这两个有趣的项目链接在一起,而放弃其他项目,如

兴趣1=兴趣2
兴趣1=兴趣2
兴趣1=兴趣2
etc,每个序列1个lne

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


感谢您的宝贵时间,感谢您提出的任何建议。在这种情况下,请创建一个与重复文本相匹配的regexp,并将感兴趣的部分分组。然后您应该能够使用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)

尽管如评论中所述,islice绝对是一个更简洁的解决方案。

在这种情况下,创建一个与重复文本匹配的regexp,并为感兴趣的位创建组。然后您应该能够使用findall查找所有感兴趣的案例1和感兴趣的案例2

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]
像这样: 进口稀土

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

我已经加入了大量的断言来检查数据布局的规律性

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

我已经加入了一大堆断言来检查数据布局的规律性

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>

如果您有一些示例代码,可能会有所帮助。很难说您希望如何确定什么是“有趣的”“。它总是在索引4中吗?正如monkut所说,你试图对问题进行过度简化,不幸的是,这使得你很难理解你想做什么或为什么要做它听起来像什么。不要害怕包含一些真实的数据,这样我们就可以看到发生了什么。对不起。有趣的单词是单个文本单词,总是处于相同的位置,由空格分隔。措辞可能被视为敏感,因此用普通词语替换。如果利息1是一个国家保险号码,利息2是一个状态,那么剩下的是个人数据,这能澄清问题吗?@HOMENT:请不要评论你自己的问题。请更新您的问题,包括示例代码和预期输出。如果您有一些示例代码,可能会有所帮助。很难说你希望如何确定什么是“有趣的”。它总是在索引4中吗?正如monkut所说,你试图对问题进行过度简化,不幸的是,这使得你很难理解你想做什么或为什么要做它听起来像什么。不要害怕包含一些真实的数据,这样我们就可以看到发生了什么。对不起。有趣的单词是单个文本单词,总是处于相同的位置,由空格分隔。措辞可能被视为敏感,因此用普通词语替换。如果利息1是一个国家保险号码,利息2是一个状态,那么剩下的是个人数据,这能澄清问题吗?@HOMENT:请不要评论你自己的问题。请通过包含示例代码和预期输出来更新您的问题。假定您指的是四行re.VERBOSE样式的regexp,第二行类似于\s*wordx\s+\s+\s+\s+\s+(\s+)\s+\s+\s+\s+\s+\s+\s*\n。。。OP可能需要一些帮助。用一点解释把它拼出来,以及如何调整它,至少会让你获得一张赞成票;-)嗯。。。不需要,您只需要一个与所讨论的文本实际匹配的regexp,但不匹配部分或多次重复。我认为没有必要在上显示四行,而在\s+上显示长行。。。无论如何,小岛是一个更好的解决方案。尽管如此,我还是用一个完整的解决方案对其进行了更新。假定您指的是一个四行re.VERBOSE样式的regexp,第二行类似于\s*wordx\s+\s+\s+\s+\s+\s+(\s+)\s+\s+\s+\s+\s*\n。。。OP可能需要一些帮助。用一点解释把它拼出来,以及如何调整它,至少会让你获得一张赞成票;-)嗯。。。不需要,您只需要一个与所讨论的文本实际匹配的regexp,但不匹配部分或多次重复。我认为没有必要在上显示四行,而在\s+上显示长行。。。无论如何,小岛是一个更好的解决方案。尽管如此,我还是更新了一个完整的解决方案。