我刚开始使用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的列表中的第二个元素,因此我不知道它为什么超出范围。任何帮助或建议将不胜感激。在
简单的答案是,有时数据不符合编写此代码时假定的规范(即有一个冒号和两个字段)。在
处理这个问题最简单的方法是添加if块
if len(splot)==2:
,并在该块中执行后续的行。在或者,添加一个
else:
,并打印不符合规范的行,或者将它们保存到某个地方,以便进行诊断。在像这样:
或者,您可以使用try/except,在本例中,它更健壮,因为我们可以在任何地方处理索引器错误,无论是在}中,只有一个异常处理程序,而且我们不必指定
row[0]
还是在{:
拆分字段的长度应该是2。在此外,我们可以在拆分之前显式地检查是否存在
^{pr2}$:
,并适当地分配名称。在我非常确定有些行中
name_str
中没有:
。从您自己的例子来看,如果name_str
是Cell_line
,那么它将失败。在如果您确定
name_str
(最多)中只有1:
,或者如果有多个:
要选择最后一个,而不是splt[1]
,那么应该使用-splt[-1]
。-1索引将获取列表中的最后一个元素(除非其为空)。在相关问题 更多 >
编程相关推荐