CSV к сценарию JSON

Я взял этот сценарий отсюда:

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

7
задан Zeynel 10 December 2009 в 22:18
поделиться

3 ответа

Измените вложенный цикл для на:

out = [dict(zip(keys, property)) for property in reader]

и, нет, распечатка не будет выдавать действительный JSON - используйте print json.dumps (out) (вам, конечно же, потребуется импортировать json - это стандартный библиотечный модуль Python 2.6, но вы можете найти версии, работающие с 2.5, если вам это нужно).

14
ответ дан 6 December 2019 в 10:00
поделиться

Возможно, вы пытаетесь разобрать пустую строку в конце файла

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" ))
0
ответ дан 6 December 2019 в 10:00
поделиться

Поскольку вы фактически не создаете 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

Что-то вроде этого обычно работает лучше.

0
ответ дан 6 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: