我有一个像
这样的文本文件1 2 3 4 5 6 7 8 9 10
......等等。
如何编写程序以打印前2行然后跳过3然后打印2行(这就是模式。)
我是一个完整的菜鸟 任何帮助将不胜感激。
感谢。
答案 0 :(得分:4)
基于行枚举并假设一个5项循环(显示前两项,跳过下面三项):
for i, line in enumerate(file('myfile.txt')):
if i % 5 in (0, 1):
print line
答案 1 :(得分:2)
我不知道是否有这种模式,真的。您可以只file.readlines()
整个事情并使用数组切片。如果您担心内存消耗,请在itertools.compress()
生成的模式上使用itertools.cycle()
迭代文件句柄。或者,你知道,只需写一个循环或列表理解。
答案 2 :(得分:1)
我能想到的最好的就是使用模运算符。像这样:
f = open('filename.txt', 'r')
for index, line in enumerate(f.readlines()):
if index%5 <= 1:
print(line)
这应该会产生您正在寻找的模式。
答案 3 :(得分:1)
由于其他人在这里击败了我的答案是单行版本:
print list(line for lineNum, line in enumerate(open("test.txt", "r")) if lineNum % 5 in (0, 1))
: - )
答案 4 :(得分:1)
with open(filename) as f:
print ''.join( f.readline() for i in xrange(7) if i in (0,1,5,6))
或
with open(filename) as f:
print ''.join( f.readline() for i in '1100011' if i=='1')
或
with open(filename) as f:
print ''.join( i*f.readline() for i in (1,1,0,0,0,1,1))
答案 5 :(得分:0)
以@pynator的答案为基础,并使用itertools
module,
这是与ifilter
- imap
组合相同的解决方案。
z
是一个可迭代的,如file("myfile.txt")
。
imap
用于从枚举对中选择原始数据项。
>>> from itertools import ifilter, imap
>>> result = imap(lambda x: x[1], ifilter(lambda x: x[0]%5 in (0,1), enumerate(z)))
>>> for i in result: print i
...
line 1
line 2
line 6
line 7
line 11
line 12
line 16
line 17
>>>