2016-04-30 11 views
0

を取り込むの何が問題なのです私はループでprint wordsを行う場合は、私は次のコードで辞書<code>newDict</code>を移入する辞書

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

を、ここに私が得るものがあります:

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

私は間違っていますか?

+0

exeとは?あなたは幹部を意味しましたか? –

+2

おそらく5ワード未満の行があるので、 'words [4]'はIndexErrorを発生させます。最後の行には空の行がありますので、output.strip()。split( '\ n') '行で' 'それを取り除いてみてください。 –

+0

@AndrésPrez-AlbelaH。編集された質問。 – aceph

答えて

1

私はそう思う、それはタイプミスです: words[3]の代わりにwords[4]を使用します。

BTW: ここに少し改良されたバージョンのコードがあります。 split('\n')の代わりにsplitlines()を使用し、空の行をスキップします。そしてそれは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

これはうまくいきません。それは今働いています:|。それを指摘していただきありがとうございました – aceph

+1

ああ、しかし、 'print words'行を削除してください。悪い:それはpython2xスタイルです!;-) – cbo

+0

'lenの場合(line.strip())== 0:' は 'はAttributeError: 'タプル' オブジェクトが「何の属性を持っていないが列挙して、あなたは私のために'書いたラインを – aceph

0

私の最高の推測では、言葉は、オールウェイズ5つの項目を、保持していないということです

辞書を割り当てる前に、LEN(ワード)を印刷してみてください。

1

今すぐ「単語」が短すぎるかどうかを確認する必要があります。いくつかの行を分割した後にリストの長さが問題になる可能性があります(要素が不足しています)。

+0

チェックを編集してください... – aceph

+0

haha​​、言葉[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に表示されます。問題は - ご覧のとおり - すべての行に4つの単語が含まれているわけではありません(下部に空の行があります)。以上のニシキヘビ:私も書き換えたコードで

 
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) 

(変更は太字で強調表示)

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

あなたは、このようにラインが4つの列を持っているかどうかのチェックを実装する必要がありますwords[4]words[3]