python - 如果语句和列表索引超出范围

时间:2014-09-18 12:33:30

标签: python

我有一个csv文件,第一部分由3个条目组成,第二部分由2个条目组成。我想隔离由3个条目组成的数据。

我写了以下内容:

filename=open("datafile.txt","r")
data_3_entries_list=[]

 for line in filename:
    fields=line.split(",")
    if fields[2] == 0:
        break
    else:
        data_3_entries_list.extend(line)

我收到错误消息:
如果fields [2] == 0: IndexError:列表索引超出范围      打印(data_3_entries_list)

我也尝试过如果fields [2]为None但我得到同样的错误。 我不明白为什么我得到这个错误?

4 个答案:

答案 0 :(得分:2)

使用len()或str.count()

for line in filename:
    fields=line.split(",")
    if len(fields) == 3:
        data_3_entries_list.append(line)

for line in filename:
    if fields.count(",") == 2:
        data_3_entries_list.append(line)

答案 1 :(得分:1)

列表中不存在的元素没有隐含值;如果fields只有2个项目,则fields[2]根本不存在,并会产生错误。

明确检查清单的长度:

if len(fields) == 3:
    break
data_3_entries_list.append(line)  # You may want append here, not extend

答案 2 :(得分:0)

如果我有像这样的csv文件,那么这可以解决

 with open('datafile.csv', 'w') as p:
    p.write("Welcome,to,Python")
    p.write("Interpreted,Programming,Language")

 filename=open("datafile.csv","r")
 data_3_entries_list=[]

 for line in filename:
    fields=line.split(",")
    if fields[2] == 0:
        break
    else:
        data_3_entries_list.extend(line)

否则,您必须至少向我们展示您的csv文件是如何格式化的。

答案 3 :(得分:0)

您收到错误是因为您试图获取可能不存在的索引的值。不过,还有更好的方法。

您可以使用拆分来查看索引是否存在,而不是直接测试长度。不是len(a_list) >= 3的列表只会返回一个空列表。

>>> mylist = range(3) #this list is [0, 1, 2]
>>> mylist[2:]
[2]

>>> mylist = range(2) #however THIS list is [0, 1]
>>> mylist[2:]
[]

通过这种方式,您可以使用pythonic if a_list: do_work()来测试您是否想要处理数据。此语法通常优先于if len(a_list) == value: do_work()

filename=open("datafile.txt","r")
data_3_entries_list=[]

 for line in filename:
    fields=line.split(",")
    if fields[2:]:  ##use a split to verify that such a split yields a result
        data_3_entries_list.extend(line)