【问题标题】:Search of elements inside a big CSV file using Python使用 Python 在大 CSV 文件中搜索元素
【发布时间】:2016-01-15 20:03:16
【问题描述】:

我试图过滤一个 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', '']]

有人可以帮我吗?

【问题讨论】:

    标签: python python-2.7 csv


    【解决方案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)
    

    很可能有一行是空白或条目太少,此脚本将列出哪些行号有问题。

    【讨论】:

      【解决方案2】:

      我不知道您的 power_supply_info.csv 文件中有什么,但很清楚您在 csv.reader 完成工作后拥有什么:

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

      这就是您访问 第 5 个 元素时出错的原因,只有 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]
      

      最好的问候

      【讨论】:

      • 他访问的不是列表中的第五个元素,而是列表中包含的每个子列表的第五个元素。这些已经足够长了,至少大部分是。
      • 他的问题字面意思是“什么是“单词”变量......”,这就是为什么我的答案包含两段代码。一个覆盖他的陈述,另一个覆盖可能的现实。感谢您不阅读。
      • 我同意他的问题模棱两可。然而,他的进一步 cmets 澄清问题不在于列表的大小,这从他对itemgetter() 的使用中也很清楚,因为它的使用方式(使用map())只能访问子列表,而不是“只有 2 个元素的主列表”。所以我猜你也没有完成所有的阅读。报复性投票并不是解决此问题的真正方法(尤其是因为我没有对您的帖子投反对票),现在是吗?
      • 模棱两可,我的答案是在他评论您的答案之前发布的,表明它部分起作用(然后澄清)。我的答案是“0”,我没有暗示和/或声明你投了反对票
      【解决方案3】:

      您显示的代码与您提供的数据示例一起正常工作:

      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]
      

      【讨论】:

      • 它的部分工作!我可以得到值,但仍然显示超出范围的错误 =\。 0 0 0 0 0 0 0 0 0 0 0 code Traceback (most recent call last): File "&lt;stdin&gt;", line 1, in &lt;module&gt; 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 32, in &lt;module&gt; print item[5] IndexError: list index out of range &gt;&gt;&gt;
      • 好的,那么 CSV 文件中的某些行的结构与大多数其他行不同,并且显然可以包含一些但少于 5 个项目。您需要找到这些行并忽略它们/删除它们。
      猜你喜欢
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 2011-08-30
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多