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. Второй "для строки в рекламных роликах:" ничего не делает. Есть что-то, что мне не хватает? Как я могу сделать словарь в то, что я могу ссылаться повторно?

Ответ 1

Вам просто нужно найти файл в начале:

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

Ответ 2

В 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 и в следующих разделах объясняется это.

Ответ 3

Если вы хотите повторно использовать читатель, вы можете найти файл обратно в 0. Но если первая строка int 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 использует первую строку в качестве клавиш словаря (если они не поставляются иным образом). Создание нового объекта-читателя намного проще. Вы также можете скопировать данные в структуру данных, такую ​​как список и цикл за ней.