Python:如何使用DictReader两次?

Python:如何使用DictReader两次?,python,csv,dictionary,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("bl

这感觉像是一个非常基本的问题,但我在其他地方找不到任何提及。我是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>"
#/usr/bin/python
导入csv
导入cgi
进口cgitb
cgib.enable()
打印“标题”
f=打开(“blurbs.csv”、“rb”)
blurbs=csv.DictReader(f,分隔符=“\t”)
对于布告中的行:
打印行
对于布告中的行:
打印行
f、 关闭()
打印“”

将只打印blurbs.csv的内容一次。第二行的“广告语:”什么也不做。有什么我遗漏的吗?我怎样才能使词典成为我可以反复引用的内容?

您只需从头开始查找文件:

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
或者,您可以将字典生成包装到一个dict列表中,并对其进行操作:

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
在Python(以及几乎所有的计算机语言)中,如果要存储某些内容,必须显式地进行存储。只是打印出来并不能把它保存在任何地方,除了屏幕上

重复使用每一本字典,但每次只使用一本,这很容易<代码>行已存储每个字典,一次存储一个:

for row in blurbs:
    print row
    print row
    print row

要重复使用所有字典,您需要将所有字典存储在某个位置

它们已经在
blurbs
中了,但是
blurbs
是一个可以循环一次的东西。一旦你做完了,里面就什么都没有了。这就是为什么你的第二个循环什么也不打印

你想要一个——你可以索引、搜索、循环几十次,等等。当没有特殊情况需要担心时,最明显的序列类型是一个列表。因此:

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)


上的教程部分和以下部分对此进行了解释。

如果您想重新使用读卡器,可以将文件查找回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使用第一行作为字典键(如果没有提供)。创建一个新的reader对象要简单得多。您还可以将数据复制到数据结构(如列表)中,并在其上循环。

这并不是真正的“使字典成为我可以重复引用的内容”添加了解决第二个问题的替代方案。