使用Python搜索大型CSV文件中的元素

时间:2016-01-15 11:42:06

标签: python python-2.7 csv

我试图过滤CSV文件并获取另一个列表中列表的第五个值,但是我一直超出范围。

import csv
from operator import itemgetter
teste=[]
f = csv.reader(open('power_supply_info.csv'), delimiter =',' )
for word in f:
    teste.append(word)
    #print teste    
    #print ('\n') 
print map( itemgetter(5), teste)

但是,我收到了这个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\rafael.paiva\Dev\Python2.7\WinPython-64bit-2.7.6.4\python-2.7.6.amd64\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 540, in runfile
    execfile(filename, namespace)
  File "C:/Users/rafael.paiva/Desktop/Rafael/CSV.py", line 24, in <module>
    print map( itemgetter(5), teste)
IndexError: list index out of range

“word”变量中的内容是什么,根据步骤附加到“teste”是:

[['2015-12-31-21:02:30.754271', '25869', '500000', 'Unknown', '1', '0', '4790780', '1', '0', '0', '375', '0', '-450060', '-326040', '3437000', 'Normal', 'N/A', '93', 'Good', '19', '1815372', 'Unknown', 'Charging', '4195078', '4440000', '4208203', '4171093', '0', '44290', 'Li-ion', '95', '1', '3000000', '1', '375', '-450060', '-326040', '3437000', '93', 'Good', '1815372', '4195000', '4440000', '4208203', '4165625', '0', '44290', '95', '3000000', '1', ''],
 ['2015-12-31-21:03:30.910972', '25930', '500000', 'Unknown', '1', '0', '4794730', '1', '0', '0', '377', '0', '55692', '107328', '3437000', 'Normal', 'N/A', '92', 'Good', '19', '1814234', 'Unknown', 'Charging', '4200390', '4440000', '4207734', '4214062', '0', '41200', 'Li-ion', '95', '1', '3000000', '1', '377', '55692', '107328', '3437000', '92', 'Good', '1814234', '4200390', '4440000', '4207734', '4214062', '0', '41200', '95', '3000000', '1', '']]

有人可以帮我吗?

3 个答案:

答案 0 :(得分:1)

您应该为循环添加一些诊断,这将有助于向您显示csv文件中可能存在的问题:

import csv
from operator import itemgetter

teste = []

with open('power_supply_info.csv', 'rb') as f_input:
    for line, words in enumerate(csv.reader(f_input, delimiter =',' ), start=1):
        if len(words) <= 5:
            print "Line {} only has {} elements".format(line, len(words))
        teste.append(words)

print map(itemgetter(5), teste)

您的其中一行可能是空白或条目太少,此脚本会列出哪些行号有问题。

答案 1 :(得分:0)

我不知道你power_supply_info.csv档案中的内容,但是csv.reader完成任务后你明白了什么:

  • 包含 2 列表的列表(即: 2 元素)

这就是为什么您在访问 5th 元素时出错,只有 2

解决问题的可能方法:

import csv

f = csv.reader(open('power_supply_info.csv'), delimiter =',' )
# First iterate over the rows and then get each list in the row
teste = [x for x in (row for row in f)]
print map(lambda x: x[5], teste)

真正的挑战是查看您在 csv 文件中的输入,以了解为什么您最终会在列表中找到这两个列表。

注意:如果您的输出属于 teste 而不是 word ,则代码可能是:

import csv

f = csv.reader(open('power_supply_info.csv'), delimiter =',' )
teste = [row for row in f]
print [x[5] for x in teste]

祝你好运

答案 2 :(得分:-1)

您显示的代码可以正确使用您提供的数据样本:

In [8]: l = [['2015-12-31-21:02:30.754271', '25869', '500000', 'Unknown', '1', '0', '4790780', '1', '0', '0'],
   ...:      ['2015-12-31-21:03:30.910972', '25930', '500000', 'Unknown', '1', '0', '4794730', '1', '0', '0']]

In [9]: list(map(itemgetter(5),l))
Out[9]: ['0', '0']

我怀疑CSV文件中的一行(可能是最后一行)是空白的,因此teste的最后一个元素实际上是一个空列表,因此itemgetter(5)对最后一行失败。

不要将所有内容都塞进一行,请尝试

for item in teste:
    if item:
        print item[5]