我想在以下代码中填充字典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 :(得分:1)
答案 1 :(得分:1)
我认为,这是一个错字:
您使用words[4]
代替words[3]
。
顺便说一句:
这是代码的略微改进版本。它使用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)
答案 2 :(得分:0)
我最好的猜测是,单词并不总是包含五个项目,
请在分配字典之前尝试打印len(单词)。
答案 3 :(得分: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
上。问题是 - 正如你所看到的那样 - 不是每一行都包含四个单词(底部有空行)。或更多pythonic:
>>> 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]
。