在Python中读取特定的行序列

我有一个如下所示的示例文件:

    @XXXXXXXXX
    VXVXVXVXVX
    +
    ZZZZZZZZZZZ
    @AAAAAA
    YBYBYBYBYBYBYB
    ZZZZZZZZZZZZ
    ...

所以我应该读VXVXV (4*0+2 = 2)...行和YBYB...(4*1 +2 = 6) VXVXV (4*0+2 = 2)...行。我希望只读取索引4i + 2上的行, YBYB...(4*1 +2 = 6)在上面的代码段中。 我需要计算'V's, 'X's,'Y's and 'B's并存储在一个预先存在的字典中。

fp = open(fileName, "r")
lines = fp.readlines()

for i in xrange(1, len(lines),4):
    for c in str(lines(i)):
        if c == 'V':
             some_dict['V'] +=1

有人可以解释我该如何避免离开索引,只读取行列表中4 * i + 2索引处的行?


你不能只切分线的列表?

lines = fp.readlines()
interesting_lines = lines[2::4]

编辑其他人质疑它是如何工作的:

“完整”切片语法由三部分组成: start:end:step

start是起始索引,默认为0。 因此,对于4 * i + 2,当i == 0时,即索引2。

end是结束索引,或默认情况下是len(sequence) 。 切片上去但不包括最后的索引。

step是所选项目之间的增量,默认为1。 通常,像3:7这样的片会返回元素3,4,5,6(而不是 7)。 但是,当您添加一个step参数时,您可以执行“步骤4”等操作。

“步骤4”意味着start+0, start+4, start+8, start+12, ...这是OP想要的,只要start参数选择正确。


您可以执行以下任一操作:

在0处开始xrange ,然后在次循环中将2加到i

for i in xrange(0, len(lines), 4):
    for c in str(lines(i+2))
        if c == 'V':
            some_dict['V'] += 1

在2处启动xrange ,然后按照原始程序中指定的方式访问i

for i in xrange(2, len(lines), 4):
    for c in str(lines(i))
        if c == 'V':
            some_dict['V'] += 1

我不清楚你在这里做什么---你是否只是试图从磁盘读取你想要的行? (在这种情况下,你从一开始就出错了,因为readlines()会读取整个文件。)或者你只是想过滤行列表来挑选出你想要的?

我会假设后者。 在这种情况下,最简单的事情就是使用listcomp来按索引过滤行。 比如简单的事情:

indices = [x[0] * 4 + 2 for x in enumerate(lines)]
filtered_lines = [lines[i] for i in indices if len(lines) > i]

在那里你走了,你只需要你想要的线,没有索引错误或任何愚蠢的东西。 然后,您可以分离出来并简化剩余的代码来进行计数,只需对已过滤的列表进行操作即可。

(只是稍微编辑了第一个列表comp,稍微习惯一些)

链接地址: http://www.djcxy.com/p/69967.html

上一篇: Read specific sequence of lines in Python

下一篇: scipy.quad trouble for decreasing functions over large ranges