Python: как использовать DictReader дважды?

Это кажется очень основным вопросом, но я не могу найти никакого упоминания об этом в другом месте. Я начинающий пользователь 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 row in blurbs:" ничего не делает. Я что-то упускаю? Как я могу сделать словарь чем-то, на что я могу ссылаться неоднократно?

3 ответов


вам просто нужно искать файл обратно на старт:

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

в качестве альтернативы вы можете обернуть генерацию словаря в список диктов и работать над этим:

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 (и почти всех компьютерных языках), если вы хотите что-то сохранить, вы должны сделать это явно. Просто распечатка его не держит его нигде, кроме как на экране.

использовать каждого словарь неоднократно, но только по одному за раз, это легко;row и уже хранение каждого словаря, по одному за раз:

for row in blurbs:
    print row
    print row
    print row

использовать все словарей повторно, вам нужно хранить все из них где-то.

они are уже в 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 намного проще. Вы также можете скопировать данные в структуру данных, такую как список, и зациклиться на этом.