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