我有档案
Header 1
line 1
line 2
line 3
line 4
Header 2
line 1
line 2
line 3
line 4
我想读取Header 1然后读取它下面的第3行和第4行,之后我想读取Header 2然后在不同的上下文中读取它下面的第3行和第4行。在两种情况下搜索第3行和第4行的字符串是相同的,但行不完全相同。目前我正在使用
搜索标题1for line in file
if "Header 1" in line:
我无法在此文件的循环内部使用readline来读取4行的块。
答案 0 :(得分:0)
存储所有行,然后分析它们:
data = open("filename.txt").readlines()
这样可以根据需要在行之间轻松跳转,直接从文件中读取时不行。
答案 1 :(得分:0)
展开的答案适用于小文件。如果你想要一个通用的解决方案,坚持使用迭代器和生成器。
你可以定义一个生成器函数,它会产生line_i,line_i + 3和line_i + 4的元组。
使用导入
from collections import deque
from itertools import islice
我们可以定义一个新的生成器函数:
def reflexive_zip(iterator, offset = 0):
offset = int(offset)
if offset == 0:
for element in iterator:
yield (element, element)
else:
d = deque(islice(iterator,abs(offset)))
for element in iterator:
d.append(element)
if offset < 0:
yield (element, d.popleft())
else:
yield (d.popleft(), element)
需要iterator
,使用deque
创建一些缓冲区并生成iterator
元素的元组。可以通过offset
参数控制偏移量。
这是完整的脚本。用法示例位于 main 部分。
if __name__ == "__main__":
from cStringIO import StringIO
f = StringIO("""Header 1
line 1
line 2
line 3
line 4
Header 2
line 1
line 2
line 3
line 4""")
#for line, other_line in reflexive_zip(f, 4):
# print "%s -> %s" %(line, other_line)
for ((line, _ignore),(line3, line4)) in reflexive_zip(reflexive_zip(f,1),3):
print "%s -> %s %s" %(line, line3, line4)
from collections import deque
from itertools import islice
def reflexive_zip(iterator, offset = 0):
offset = int(offset)
if offset == 0:
for element in iterator:
yield (element, element)
else:
d = deque(islice(iterator,abs(offset)))
for element in iterator:
d.append(element)
if offset < 0:
yield (element, d.popleft())
else:
yield (d.popleft(), element)
if __name__ == "__main__":
from cStringIO import StringIO
f = StringIO("""Header 1
line 1
line 2
line 3
line 4
Header 2
line 1
line 2
line 3
line 4""")
#for line, other_line in reflexive_zip(f, 4):
# print "%s -> %s" %(line, other_line)
for ((line, _ignore),(line3, line4)) in reflexive_zip(reflexive_zip(f,1),3):
print "%s -> %s %s" %(line, line3, line4)
输出:
Header 1
-> line 3
line 4
line 1
-> line 4
Header 2
line 2
-> Header 2
line 1
line 3
-> line 1
line 2
line 4
-> line 2
line 3
Header 2
-> line 3
line 4