这感觉就像一个非常基本的问题,但我在其他地方找不到任何提及。我是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:”什么也没做。有什么我想念的吗?如何将字典重复引用?
答案 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
,但blurbs
是iterator - 您可以循环一次。一旦你完成它,它就没有任何东西了。这就是你的第二个循环没有打印的原因。
你想要一个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使用第一行作为字典键(如果没有提供它们)。创建一个新的阅读器对象要简单得多。您还可以将数据复制到数据结构中,如列表并循环遍历该数据结构。