Я взял этот сценарий отсюда:
import csv
from itertools import izip
f = open( '/django/sw2/wkw2/csvtest1.csv', 'r' )
reader = csv.reader( f )
keys = ( "firm_url", "firm_name", "first", "last", "school", "year_graduated" )
out = []
for property in reader:
property = iter( property )
data = {}
for key in keys:
data[ key ] = property.next()
out += [ data ]
print out
Когда я попробовал его в НЕАКТИВНОМ, я получил ошибку
Traceback (most recent call last):
File "", line 5, in
data [key] = property.next()
StopIteration
Но я попробовал
print out
снова и затем это распечатало
[{'school': 'The George Washington University Law School', 'last': 'Abbas', 'firm_url': 'http://www.whitecase.com/aabbas', 'year_graduated': ' 2005', 'firm_name': 'White & Case', 'first': ' Amr A '}, {'school': 'Ernst Moritz Arndt University Greifswald', 'last': 'Adam', 'firm_url': 'http://www.whitecase.com/kadam', 'year_graduated': ' 2004', 'firm_name': 'White & Case', 'first': ' Karin '}, {'school': 'Tashkent State Law Institute', 'last': 'Adjivefayev', 'firm_url': 'http://www.whitecase.com/vadjivefayev', 'year_graduated': ' 2002', 'firm_name': 'White & Case', 'first': ' Vilen '}]
Но когда я пытаюсь выполнить его как сценарий, это не работает, я получаю то же сообщение об ошибке.
Может кто-либо помогать зафиксировать ошибку?
(И это производит допустимый json?)
Спасибо
Править
Спасибо за ответы. Кажется, что это не правильный способ преобразовать файл CSV в json формат. Я просто пытаюсь преобразовать файл CSV с данными в нем так, чтобы я мог использовать loaddata
заполнить мою sqlite3 базу данных в django. Посмотрите этот поток в django группе: http://groups.google.com/group/django-users/browse_frm/thread/a00b529ba2147d91 для моей попытки использовать csv2json.py отрывок. И другой поток сегодня в ОС (Извините я не могу включать 2 ссылки). Я ценил бы простой способ преобразовать csv в json. Или метод, который Вы используете для заполнения django базы данных, которую я должен использовать вместо этого. Спасибо за справку.
Измените вложенный цикл для
на:
out = [dict(zip(keys, property)) for property in reader]
и, нет, распечатка
не будет выдавать действительный JSON - используйте print json.dumps (out)
(вам, конечно же, потребуется импортировать json
- это стандартный библиотечный модуль Python 2.6, но вы можете найти версии, работающие с 2.5, если вам это нужно).
Возможно, вы пытаетесь разобрать пустую строку в конце файла
for property in reader:
print repr(property) # <---try adding a print here
property = iter( property )
Также csv.DictReader может делать то, что вы хотите, уже
csv.DictReader(f,fields=("firm_url", "firm_name", "first", "last", "school", "year_graduated" ))
Поскольку вы фактически не создаете JSON, я не уверен в последнем вопросе. Вы просто распечатываете словарь Python. В основном это JSON, но не всегда.
Итак, вы должны найти хороший модуль json
и использовать его. Если у вас Python 2.6: http://docs.python.org/library/json.html
Кроме того, csv
имеет программу чтения словарей, которая делает все это намного короче и легче жить с формой. http://docs.python.org/library/csv.html#csv.DictReader
Изменить.
import csv
from your.app.models import YourClass
with open( "path/to/your/file.csv", "rb" ) as src:
rdr = csv.DictReader( src )
for row in rdr:
x= YourClass.objects.create( field=row['column'], field=row['column'], ... )
x.save()
print x
Что-то вроде этого обычно работает лучше.