1

此代码的第 6 行产生“IndexError: string index out of range”。我假设当我问“if line[6] != None”时,该行中没有内容,但我不知道为什么。我也尝试过使用!='',但问题出在此之前。

import csv
dict1={} 
list1 = csv.reader(open('014850_D_AA_20070207.txt'), delimiter='\t')
list1.next()    # skips the headers
for line in list1:
    if line[6] != None:
        dict1[line[0]]= (line[6] + ", " + line[11])
    else:
        continue    
print dict1
4

4 回答 4

2
  1. Python 索引是从零开始的,因此line[6]访问line. 在这种情况下,line没有七个元素,所以它失败了。

  2. if line[6] != None不是检查一行是否没有内容的正确方法。改为使用if len(line) < 7

  3. csv.DictReader是一个更好的界面,用于读取带有标题行的 CSV 文件。对其进行迭代可以将行作为字典,并将相应的标题项作为键,这使得代码更易于理解(与使用魔术索引相比)。

于 2012-10-16T04:49:17.997 回答
0

为了避免这种情况,将其放在“尝试”块中并使用 string.find() 例如

[-1] 用于获取字符串中的最后一个字符

还有像

else:
 continue

不寻常

我差点忘了说: if string[5] != None: 当然会引发 indexerror 因为如果它没有,它将超出范围

于 2012-10-16T06:20:25.887 回答
0

感谢所有有用的想法。我能够使用 csv.DictReader 解决我的问题,如下所示:

import csv
dictPI = {}
dictGS = {}
fh = open('014850_D_AA_20070207.txt')
for line in csv.DictReader(fh, delimiter='\t'):
    ProbeID = line['ProbeID']
    GeneSymbol = line['GeneSymbol']
    Description = line['Description']
    if GeneSymbol != '':
        dictPI[ProbeID] = GeneSymbol, Description
        dictGS.setdefault(GeneSymbol, []).append(ProbeID)
于 2012-10-17T17:05:06.620 回答
0

尝试将第 6 行替换为:

if len(line) > 6:

但可能

if len(line) > 11:

更好,因为您使用下面的 line[11]。

当您将 line[6] 测试为 == 到 None 时,您已经在尝试访问 line 的第七个元素。如果该行包含少于 7 个字符,这会给您一个索引错误

于 2012-10-16T06:09:58.470 回答