无法索引到列表中

时间:2014-12-16 14:04:35

标签: python list indexing stdout

我正在编写一个程序来读取另一个程序的输出,逐行读取并将其放在一个列表中。

#!/usr/bin/python

import subprocess

def RECEIVE(COMMAND):
    PROCESS = subprocess.Popen(COMMAND, stdout=subprocess.PIPE)
    LINES = iter(PROCESS.stdout.readline, "")
    for LINE in LINES:
        RECARR = LINE.split()
        print RECARR[14]

RECEIVE(["receivetest","-f=/dev/pcan32"])

接收测试程序的输出是:

19327481.401 receivetest: m s 0x0000000663 8 2f 00 42 02 00 e4 8a 8a
19327481.860 receivetest: m s 0x000000069e 8 00 1f 5e 28 34 83 59 1a

它是一个不断的消息流。拆分时,列表的范围为14,因为在拆分后,为了确保,我使用了:

print len(RECARR)

这给了我一个14的输出。

但每当我尝试打印最后一个元素时:

print RECARR[14]

我收到以下错误:

file "./cancheck.py", line 10, in RECEIVE
print RECARR[14]
IndexError: list index out of range

这是由列表顶部打印的一些错误文本引起的,所以我需要一些方法来确保程序只读取以

开头的行
1234567.123
/^(.......\.\d{1,3}) (.*)$/

有什么想法吗?

4 个答案:

答案 0 :(得分:6)

根据您提供的示例数据,RECARR的长度始终为14。

14是列表的 size ,而不是最大索引。要获取数组的最后一个元素,您可以尝试RECARR[13]获取此列表,或者RECARR[-1]

原因在于,在Python中,与大多数编程语言一样,数组索引为zero-based:第一个元素使用RECARR[0]访问,第二个元素使用RECARR[1]访问,因此上。因此,将使用RECARR[13]访问第14个元素(或您的最后一个元素)。

所以,你的for循环看起来像这样:

for LINE in LINES:
    RECARR = LINE.split()
    print RECARR[13] # or RECARR[-1]

答案 1 :(得分:0)

列表索引从0开始,而不是1。所以

 print RECARR[1]

打印第二个元素而不是第一个元素。因此,要打印最后一个元素,您必须使用print RECARR[13]或否定索引print RECARR[-1]

python中的列表可以描述为

enter image description here

正如您所见,可以使用-1或列表长度-1来访问最后一个元素

衡量范围的一种更简单的方法是将指数放在单元格之前。 (礼貌 - Aristide

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1

答案 2 :(得分:0)

对每个人来说,这是一个糟糕的解决方法,但我通过确定只有14个元素的行是我需要的行来解决这个问题所以我通过使用以下

来修复它
for LINE in LINES:
    RECARR = LINE.split()
    if(len(RECARR) == 14):
        #do stuff

答案 3 :(得分:-1)

你也可以做类似的事情:

try:
    print RECARR[13]
except IndexError:
    pass

通过这种方式,您可以轻松处理不够长的行。