2016-04-30 40 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]