我刚开始使用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的列表中的第二个元素,因此我不知道为什么它超出了范围。任何帮助或建议将不胜感激。
答案 0 :(得分:3)
我很确定有些行name_str
中没有:
。根据您自己的示例,如果name_str
为Cell_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)