2016-04-30 60 views
0

我想填充字典newDict在下面的代码:有什么不对填充字典

def sessions(): 
    newDict = {} 
    output = exe(['loginctl','list-sessions']) # uses subprocess.check_output(). returns shell command's multiline output 
    i = 0; 
    for line in output.split('\n'): 
     words = line.split() 
     newDict[i] = {'session':words[0], 'uid':words[1], 'user':words[2], 'seat':words[4]} 
     i += 1 
    stdout(newDict) # prints using pprint.pprint(newDict) 

但它只是不断给我的错误:

newDict[i] = {'session':words[0], 'uid':words[1], 'user':words[2], 'seat':words[4]} 
IndexError: list index out of range 

如果我在循环做print words,这里是我得到的:

['c3', '1002', 'john', 'seat0'] 
['c4', '1003', 'jeff', 'seat0'] 

我在做什么错?

+0

什么是exe?你是不是指执行官? –

+2

可能有少于5个单词的行,所以'words [4]'引发了一个IndexError。你可能在最后有一个空行,试着在output.strip()。line中分出('\ n')'来摆脱它。 –

+0

@AndrésPérez-AlbelaH。编辑的问题。 – aceph

回答

1

我认为,这是一个错字: 您使用words[4]而不是words[3]

BTW: 这是一个稍微改进的代码版本。它使用splitlines()而不是split('\n')并跳过空行。它使用enumerate(),在迭代集合时计算条目时,它是一个非常整洁的函数。

def sessions(): 
    newDict = {} 
    output = exe(['loginctl','list-sessions']) #returns shell command's multiline output 
    for i, line in enumerate(output.splitlines()): 
     if len(line.strip()) == 0: 
      continue 
     words = line.split() 
     print words 
     newDict[i] = {'session':words[0], 'uid':words[1], 'user':words[2], 'seat':words[3]} 
    stdout(newDict) # prints using pprint.pprint(newDict) 
+0

yup,一个错字,现在有效:|。感谢您指出并改进了代码 – aceph

+1

哦,但是请删除'打印文字'这一行,这是一个调试剩余。更糟糕的是:这是python2x风格!;-) – cbo

+0

'如果len(line.strip())== 0:' 'AttributeError:'tuple'object has no attribute'strip'' – aceph

0

我最好的猜测是的话,不持有永诺五个项目,

请尽量分配字典之前打印LEN(字)。

1

Imo您应该检查“words”是否不太短。在分割某行后它很可能是列表长度的问题(它没有足够的元素)。

+0

检查编辑请... – aceph

+0

哈哈,因为你正在使用的单词[4],它的0,1,2,X,4(错误的索引,你的列表是从0到3 !!!)只是简单的错误, – Damian

0

据我所知,这与字典本身无关,但解析输出。下面是输出我得到的一个例子:

SESSION  UID USER    SEAT    
     c2  1000 willem   seat0   

1 sessions listed. 

或者字符串版本:

' SESSION  UID USER    SEAT   \n  c2  1000 willem   seat0   \n\n1 sessions listed.\n' 

这一切都出现在stdout。问题是 - 正如你所看到的 - 是不是每行都包含四个单词(底部是空行)。或更Python:

>>> lines[2].split() 
[] 

你因此必须实现检查线路是否有四列:

 
def sessions(): 
    newDict = {} 
    output = exe(['loginctl','list-sessions']) # uses subprocess.check_output(). returns shell command's multiline output 
    i = 0; 
    for line in output.split('\n'): 
     words = line.split() 
     if len(words) >= 4: 
      newDict[i] = {'session':words[0], 'uid':words[1], 'user':words[2], 'seat':words[3]} 
      i += 1 
    stdout(newDict) 

的变化(以粗体突出)

在代码中,我还改写words[4]words[3]