7

.txt 入力ファイルの 2 列目から最初の要素を抽出しようとする単純なスクリプトを作成しています。

import sys

if (len(sys.argv) > 1):
    f = open(sys.argv[1], "r");
    print "file opened";

line = [];

for line in f:
    line = line.strip("\n ' '")
    line = line.split(",") 
    print line[1]

f.close();

私の入力ファイルは次のようになります。

Client 192.168.1.13 said ``ACC: d0bb38f18da536aff7b455264eba2f1e35dd976f,389182.567,-0.042,-0.893,0.333''
Client 192.168.1.13 said ``ACC: d0bb38f18da536aff7b455264eba2f1e35dd976f,389182.590,-0.036,-0.905,0.273''
Client 192.168.1.13 said ``ACC: d0bb38f18da536aff7b455264eba2f1e35dd976f,389182.611,-0.046,-0.948,0.204''
Client 192.168.1.13 said ``ACC: d0bb38f18da536aff7b455264eba2f1e35dd976f,389182.631,-0.074,-0.978,0.170''
Client 192.168.1.13 said ``ACC: d0bb38f18da536aff7b455264eba2f1e35dd976f,389182.654,-0.100,-1.006,0.171''

区切り文字をコンマにしたい。行の長さを出力すると、(予想どおり) 5 つの要素が得られます。ただし、データを抽出するためにリストのインデックスを作成しようとすると (つまり、 を呼び出すときprint line[1])、次のエラーが発生し続けます。

file opened
Traceback (most recent call last):
  File "stats.py", line 13, in <module>
    print line[1]
IndexError: list index out of range

明らかに範囲外であるのに、なぜ範囲外なのかわかりません。

4

4 に答える 4

9

ファイルのどこかに空白行があると思います。データを実行して例外を生成すると、空白行がファイルの最後になります。

挿入してください

print len(line), line

あなたの前に

print line[1]

これが当てはまるかどうかを確認するためのチェックとして。

このコンストラクトをいつでも使用して、空白行をテストし、空白行のみを処理/印刷できます。

for line in f:
    line = line.strip()
    if line:
       # process/print line further
于 2012-06-26T23:33:10.503 に答える
2

データの後に空の行がある可能性があります。それらを使用せずにテストコードを実行しましたが、期待どおりに機能しました。

$ python t.py t.txt
file opened
389182.567
389182.590
389182.611
389182.631
389182.654

それらを削除したくない場合は、空の行を確認してください。

for line in f:
    if line.strip(): # strip will remove all leading and trailing whitespace such as '\n' or ' ' by default    
        line = line.strip("\n ' '")
        line = line.split(",") 
        print line[1]
于 2012-06-26T23:37:47.063 に答える
2

リストを操作していて、特定のインデックスで値を取得しようとしている場合、インデックスが範囲内にあることを確認することは常に安全です

if len(list_of_elements) > index: 
   print list_of_elements[index]

見る:

>>> list_of_elements = [1, 2, 3, 4]
>>> len(list_of_elements)
4
>>> list_of_elements[1]
2
>>> list_of_elements[4]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> 

ここで、リストに期待したほど多くの要素が含まれていない理由を見つける必要があります

解決:

import sys

if (len(sys.argv) > 1):
    f = open(sys.argv[1], "r")
    print "file opened"

for line in f:
    line = line.strip().strip('\n')
    # Ensure that you are not working on empty line
    if line:
        data = line.split(",") 
    # Ensure that index is not out of range
    if len(data) > 1: print data[1]

f.close()
于 2012-06-26T23:33:15.550 に答える
0

例外をキャッチして問題のある行を出力すると便利な場合があります

for line in f:
    line = line.strip("\n ' '")
    line = line.split(",") 
    try:
        print line[1]
    except IndexError, e:
        print e
        print "line =", line
        raise   # if you don't wish to continue
于 2012-06-27T00:26:00.847 に答える