Python:使用结构分裂并使列表索引超出范围

2024-05-26 11:55:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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] 姓名_结构分裂返回长度为2的列表。因为我想要的部分在“:”之后,我希望第二个元素应该被索引为splt[1],因为splt[0]是python中的第一个。但是,当我运行代码时,我得到了这个错误消息“IndexError:list index out out of range” 我正在尝试长度为2的列表中的第二个元素,因此我不知道它为什么超出范围。任何帮助或建议将不胜感激。在


Tags: 文件csvcsvfile代码nameimportdataos
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]还是在{}中,只有一个异常处理程序,而且我们不必指定:拆分字段的长度应该是2。在

此外,我们可以在拆分之前显式地检查是否存在:,并适当地分配名称。在

^{pr2}$

我非常确定有些行中name_str中没有:。从您自己的例子来看,如果name_strCell_line,那么它将失败。在

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

相关问题 更多 >