Python:我如何使用DictReader两次?

Nic*_*CHK 13 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>"
Run Code Online (Sandbox Code Playgroud)

只会打印出一次blurbs.csv的内容.第二个"for blur in blur:"什么也没做.有什么我想念的吗?如何将字典变成我可以反复引用的内容?

Pyr*_*rce 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
Run Code Online (Sandbox Code Playgroud)

或者,您可以将字典生成包装成一个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
Run Code Online (Sandbox Code Playgroud)


aba*_*ert 7

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

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

for row in blurbs:
    print row
    print row
    print row
Run Code Online (Sandbox Code Playgroud)

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

他们已经在blurbs,不过blurbs是一个迭代器 -something你可以遍历一次.一旦你完成它,它就没有任何东西了.这就是你的第二个循环没有打印的原因.

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

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)
Run Code Online (Sandbox Code Playgroud)

迭代器的教程部分和以下部分解释了其中的一些内容.