2014-11-14 23 views
0

的Python 2.6(必要的作业)Python 2.6我怎样才能重申一个带有列表对象的DictReader对象?

import csv 

list = ['apple,whiskey,turtle', 'orange,gin,wolf', 'banana,vodka,sparrow'] 
fieldNames = ['Fruit', 'Spirit', 'Animal'] 
reader = csv.DictReader(list,fieldnames= fieldNames) 

for row in reader: 
    print row['Fruit'] 

for row in reader: 
    print row['Fruit'] 

我有一个生成每行项目的统一列表,使得列表对象的一些代码。为了便于使用,我使用了csv模块的DictReader来遍历行并进行所需的任何计算,但是当我尝试第二次迭代时,我没有输出。我怀疑列表的结尾是被当作EOF对待的,但是我无法'重新寻找'到列表的开头来再次进行迭代。

关于我能做什么的建议?也许有比使用CSV更好的方法,它看起来很方便。

新代码

import csv 

list = ['apple,"whiskey,rum",turtle', 'orange,gin,wolf', 'banana,vodka,sparrow'] 
processed = [] 
fieldNames = ['Fruit', 'Spirit', 'Animal'] 
reader = csv.DictReader(list,fieldnames= fieldNames, quoatechar = '"') 

for row in reader: 
    processed.append(row) 
    print row 

for row in processed: 
    print row['Fruit'] 

for row in processed: 
    print row['Spirit'] 

@jonrsharpe建议把读者的行到一个列表。它适用于我想要的。谢谢大家。

+0

的'DictReader'设计遍历文件,而不是商店这一切都在一起去;把它放在一个列表中以“保存”它。 – jonrsharpe 2014-11-14 21:10:03

+0

@jonrsharpe它已经在列表中,但我正在使用DictReader尝试处理数据,就像我将它加载为csv文件一样。这对一次传球效果很好,但对能够进行第二次传球感到好奇。使用csv,我可以将文件重新设置为以file.seek(0)开始,然后再重复一次。想知道是否可以通过DictReader中的列表获得该功能。 – Katanamatata 2014-11-14 21:13:40

+0

不,我的意思是将'DictReader'生成的字典存储在列表中。 – jonrsharpe 2014-11-14 21:14:45

回答

1

你确实是正确的,遍历行一次就是DictReader提供的。所以,你的选择是:

  • 创建一个新的DictReader,并再次重复(好像浪费)
  • 遍历行一次,执行要在行执行
  • 迭代,一旦所有的计算,存储数据存储在另一个数据结构中,并按照您的意愿多次遍历该数据结构。

此外,如果您只有列表和字段名称,则不需要DictReader即可完成相同的操作。如果您知道数据是相对简单(没有逗号的例如数据和所有相同数量的项目内),那么你可以简单地做:

merged = [zip(fieldnames, row.split(",")) for row in my_list] 
print merged 
+0

不仅仅是''DictReader'',而是一般的Python迭代器(注意;'iterator!= iteratable')。该协议是*单向*与*随机访问*。 – aruisdante 2014-11-14 21:15:47

+0

这很漂亮。我是Python的新手,所以这是很好的信息,但不幸的是,有些时候我在字段值中看到逗号。这就是为什么'DictReader'对我有用,因为我可以指定'quotechar'来忽略这些逗号出现在字段中的情况。 – Katanamatata 2014-11-14 21:18:46

相关问题