Python:使用str.split并使列表索引超出范围

时间:2015-08-07 01:13:35

标签: python indexing string-split

我刚开始使用python并试图将我的一些R代码转换为python。任务相对简单;我有许多带有变量名称(在本例中为单元格行)和值(IC50)的csv文件。我需要提取所有变量及其在所有文件中共享的值。其中一些文件共享保存变量,但格式不同。例如,在某些文件中,变量只是“Cell_line”,而在其他文件中则是MEL:Cell_line。所以首先要做一个直接的字符串比较,我需要将它们格式化相同,因此我尝试使用str.split()来做到这一点。可能有更好的方法来做到这一点,但现在我使用以下代码:

import csv
import os
# Change working directory
os.chdir("/Users/joshuamannheimer/downloads")
file_name="NCI60_Bleomycin.csv" 
with open(file_name) as csvfile:
    NCI_data=csv.reader(csvfile, delimiter=',')
    alldata={}
    for row in NCI_data:
        name_str=row[0]
        splt=name_str.split(':')
        n_name=splt[1]
        alldata[n_name]=row

[1] name_str.split返回长度为2的列表。由于我想要的部分在“:”之后,我想要第二个元素应该被索引为splt [1],因为splt [0]是python中的第一个。但是,当我运行代码时,我收到此错误消息“IndexError:list index out of range” 我正在尝试长度为2的列表中的第二个元素,因此我不知道为什么它超出了范围。任何帮助或建议将不胜感激。

2 个答案:

答案 0 :(得分:3)

我很确定有些行name_str中没有:。根据您自己的示例,如果name_strCell_line则会失败。

如果您确定:(最多)中只有1 name_str,或者有多个:,您想要选择最后一个,而不是{ {1}},您应该使用 - splt[1]。 -1 index将获取列表中的最后一个元素(除非它为空)。

答案 1 :(得分:2)

简单的答案是,有时数据不符合编写此代码时假定的规范(即有冒号和两个字段)。

处理此问题的最简单方法是添加if块if len(splot)==2:并执行该块中的后续行。

或者,添加else:并打印不符合规格的行或将其保存在某处,以便进行诊断。

像这样:

import csv
import os
# Change working directory
os.chdir("/Users/joshuamannheimer/downloads")
file_name="NCI60_Bleomycin.csv" 
with open(file_name) as csvfile:
    NCI_data=csv.reader(csvfile, delimiter=',')
    alldata={}
    for row in NCI_data:
        name_str=row[0]
        splt=name_str.split(':')
        if len(splt)==2: 
             n_name=splt[1]
             alldata[n_name]=row
        else:
             print "invalid name: "+name_str

或者,您可以使用try/except,在这种情况下更加健壮,因为我们可以使用一个异常处理程序在row[0]split[1]中的任何位置处理IndexError ,我们不必指定:拆分字段的长度应为2.

此外,我们可以在拆分之前明确检查实际存在:,并正确指定名称。

import csv
import os
# Change working directory
os.chdir("/Users/joshuamannheimer/downloads")
file_name="NCI60_Bleomycin.csv" 
with open(file_name) as csvfile:
    NCI_data=csv.reader(csvfile, delimiter=',')
    alldata={}
    for row in NCI_data:
        try:
            name_str=row[0]
            if ':' in name_str:
                splt=name_str.split(':')
                n_name=splt[1]
            else:
                n_name = name_str
            alldata[n_name]=row
        except IndexError: 
            print "bad row:"+str(row)