我正在编写一个程序来读取另一个程序的输出,逐行读取并将其放在一个列表中。
#!/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}) (.*)$/
有什么想法吗?
答案 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中的列表可以描述为
正如您所见,可以使用-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
通过这种方式,您可以轻松处理不够长的行。