Python:我如何使用DictReader两次?

时间:2013-12-10 23:04:35

标签: python csv dictionary

这感觉就像一个非常基本的问题,但我在其他地方找不到任何提及。我是Python用户的首选。

当我使用DictReader读取数据,然后使用字典时,我无法再次引用它。例如,使用以下代码:

#!/usr/bin/python

import csv
import cgi
import cgitb
cgitb.enable()

print "<head><title>Title</title></head><body>"

f = open("blurbs.csv","rb")
blurbs = csv.DictReader(f, delimiter="\t")
for row in blurbs:
    print row
for row in blurbs:
    print row

f.close()
print "</body>"

只打印一次blurbs.csv的内容。第二个“for blur in blur:”什么也没做。有什么我想念的吗?如何将字典重复引用?

3 个答案:

答案 0 :(得分:10)

您只需要将文件重新发送到开头:

with open("blurbs.csv","rb") as f:
    blurbs = csv.DictReader(f, delimiter="\t")
    for row in blurbs:
        print row
    f.seek(0)
    for row in blurbs:
        print row

或者,您可以将字典生成包装到一个dicts列表中并对其进行操作:

with open("blurbs.csv","rb") as f:
    blurbs = list(csv.DictReader(f, delimiter="\t"))
for row in blurbs:
    print row
for row in blurbs:
    print row

答案 1 :(得分:7)

在Python(以及几乎所有计算机语言)中,如果要存储某些内容,则必须明确地执行此操作。只需将其打印出来就不会将其保留在除屏幕之外的任何地方。

要重复使用每个字典,但一次只能使用一个,这很容易; row已经已经存储每个字典,一次一个:

for row in blurbs:
    print row
    print row
    print row

要反复使用所有字典,您需要将所有存储在某处。

他们 已经在blurbs,但blurbsiterator - 您可以循环一次。一旦你完成它,它就没有任何东西了。这就是你的第二个循环没有打印的原因。

你想要一个sequence - 你可以索引,搜索,循环几十次等等。当没有特殊情况需要担心时,使用的明显序列类型是一个列表。所以:

with open("blurbs.csv","rb") as f:
    blurbs = csv.DictReader(f, delimiter="\t")
    rows = list(blurbs)

for row in rows:
    print row
print rows[13]
for row in rows:
    print row
print sorted(rows)

Iterators上的“教程”部分以及以下各节介绍了其中的一些内容。

答案 2 :(得分:0)

如果要重新使用阅读器,可以将文件重新设置为0.但是,如果csv中的第一行是标题,那么这将是输出的一部分:

>>> f = open( 'file.csv', 'rbU' )
>>> reader = csv.DictReader( f )
>>> reader.next()
{'col1': '6', 'col2': '0.9', 'col3': '8'}
>>> f.seek(0)
>>> reader.next()
{'col1': 'col1', 'col2': 'col2', 'col3': 'col3'}
>>> f.close()

DictReader使用第一行作为字典键(如果没有提供它们)。创建一个新的阅读器对象要简单得多。您还可以将数据复制到数据结构中,如列表并循环遍历该数据结构。