Python-列表索引超出csv文件范围
我试图制作一本字典,统计csv文件第13到第17列中每个条目的数量。这是我目前的代码:Python-列表索引超出csv文件范围,python,python-2.7,Python,Python 2.7,我试图制作一本字典,统计csv文件第13到第17列中每个条目的数量。这是我目前的代码: import unicodecsv with open('hashtag.csv', 'r') as inp, open('hashtag3.csv', 'w') as out: writer = unicodecsv.writer(out, delimiter=';', lineterminator='\n',encoding='ISO-8859-1') stuff = unicodecs
import unicodecsv
with open('hashtag.csv', 'r') as inp, open('hashtag3.csv', 'w') as out:
writer = unicodecsv.writer(out, delimiter=';', lineterminator='\n',encoding='ISO-8859-1')
stuff = unicodecsv.reader(inp, delimiter=';', encoding='ISO-8859-1')
my_dict={}
for row in stuff:
for i in range (13,18):
if row[i] in my_dict:
my_dict[row[i]]+=1
else:
my_dict[row[i]]=1
print my_dict
然而,当我尝试运行它时,它告诉我这一点
我的遗嘱中的第[i]行:
索引器:列表索引超出范围
我试着单独获取每个索引,以找出它出错的地方,并发现它适用于第[13]行,但不适用于我范围内的任何其他整数。
我想可能是因为在其他列中,有一些空单元格,但我甚至无法在其他列中执行if请求,而不会得到相同的错误。出于某种原因,
行
似乎没有所有13-18列。将循环的
修改为
for i in range(13,min(len(row),18)):
PS,
而不是(有点)繁琐的<代码>如果MyQuiTd< /Cord>中的行[I],您可以考虑使用:
只是想澄清一下:如果它是一个CSV文件,那么您的分隔符肯定是代码>?包括一小部分数据样本。从in-file.collections.defaultdict的一个替代方案是my_dict[row[i]]=my_dict.get(row[i],0)+1
@zwer确实如此,但我认为defaultdict
代码更“可读”和“优雅”(非常主观的品质)。老实说,我没有任何偏好地使用这两种方法……我变得懒惰,使用@zwer的解决方案,而不是使用defaultdict
。在我的辩护中,有时您确实希望无法访问未定义的键值。@Shai-同意,但这是一个偏好问题-例如,有些人可能会认为,当您的代码不依赖于外部定义的类型时(尽管我不会调用defaultdict
外部定义的类型,但是…)它确实提供的一个优点是,如果键不存在,您可以有条件地设置默认值-例如,您有一个具有由键映射的起始“计数”的查找表,您可以使用my_dict[row[i]]=my_dict.get(row[i],lookup[row[i]])+1
(但是,您可以从该查找中预构建密钥,而且……现在我只是漫无目的地说……)
from collections import defaultdict
my_dict = defaultdict(int) # accessing a new key returns zero
# ...
for row in stuff:
for i in xrange(13, min(18, len(row))):
my_dict[row[i]] += 1