我正在编写一个简单的脚本,试图从.txt输入文件的第二列中提取第一个元素。
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
我不明白为什么它显然超出了范围,显然不是。
答案 0 :(得分:7)
我猜你的文件中有一个空行。如果它运行数据然后生成异常,则空行将位于文件的末尾。
请插入
print len(line), line
之前
print line[1]
作为检查以确认是否是这种情况。
您始终可以使用此构造测试空行并仅处理/打印非 - 空白行:
for line in f:
line = line.strip()
if line:
# process/print line further
答案 1 :(得分: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]
答案 2 :(得分:0)
当你使用list并尝试在特定索引处获取值时,在index中看到的范围总是安全的
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()
答案 3 :(得分: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