在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