使用python打印备用线

时间:2011-03-01 05:17:21

标签: python

我有一个像

这样的文本文件
1
2
3
4
5
6
7
8
9
10

......等等。

如何编写程序以打印前2行然后跳过3然后打印2行(这就是模式。)

我是一个完整的菜鸟 任何帮助将不胜感激。

感谢。

6 个答案:

答案 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
>>>