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