2009-12-10 24 views
7

Tomé esta secuencia de comandos desde here:CSV para la escritura 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 

Cuando lo probé en IDLE Tengo el error

Traceback (most recent call last): 
    File "<pyshell#13>", line 5, in <module> 
    data [key] = property.next() 
StopIteration 

Pero trató

print out 

una y otra entonces imprimió

[{'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 '}] 

Pero cuando intento ejecutarlo como un script, no funciona, obtengo el mismo mensaje de error.

¿Alguien puede ayudar a reparar el error?

(y es que la salida de JSON válida?)

Gracias

Editar

gracias por las respuestas. Parece que esta no es la forma correcta de convertir un archivo csv a formato json. Solo intento convertir el archivo csv con datos para poder usar loaddata para llenar mi base de datos sqlite3 en django. Vea este hilo en el grupo django: http://groups.google.com/group/django-users/browse_frm/thread/a00b529ba2147d91 para mi intento de usar el fragmento csv2json.py. Y otro hilo hoy en OS (lo siento, no puedo incluir 2 enlaces). Apreciaría una forma simple de convertir csv a json. O el método que usas para llenar tu base de datos django que debería usar en su lugar. Gracias por la ayuda.

+1

La otra hebra de OS: http://stackoverflow.com/questions/1882469/how-do-i-transfer-data- in-csv-file-in-my-sqlite-database-in-django/1882533 # 1882533 – Zeynel

Respuesta

14

Cambiar el anidado for bucle para:

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

y no, print out no emitirá JSON válida - utilizar print json.dumps(out) (que tendrá que import json también, por supuesto - que es un Python 2.6 biblioteca estándar módulo pero puedes encontrar versiones que funcionen con 2.5 si eso es lo que necesitas).

+0

¡Gracias! Esto funciona. Pero no pude usar loaddata con ese archivo. Lo preguntaré por separado después de probar algunas cosas más. – Zeynel

+0

+1 Es un buen pedazo de código. Me robaré^h^h^h^h^h usando esta idea muy pronto. – hughdbrown

0

Quizás esté tratando de analizar una línea en blanco al final del archivo

for property in reader: 
    print repr(property)   # <---try adding a print here 
    property = iter(property) 

también csv.DictReader puede hacer lo que ya

csv.DictReader(f,fields=("firm_url", "firm_name", "first", "last", "school", "year_graduated")) 
0

quiere Puesto que usted no está realmente la creación JSON, no estoy seguro de la última pregunta. Simplemente está imprimiendo un diccionario de Python. En su mayoría son JSON, pero no siempre.

Por lo que debe encontrar un buen módulo de json y usar eso. Si tiene Python 2.6: http://docs.python.org/library/json.html

Además, csv tiene un lector de diccionario que hace todo esto en una forma mucho más corta y más fácil de vivir. http://docs.python.org/library/csv.html#csv.DictReader


Editar.

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 

Algo así normalmente funciona mejor.

3

Con el CSV Module ya tiene un dict reader incorporado! He aquí un ejemplo de script que puede ser utilizado como una herramienta de línea de comandos:

import csv 
import json 

def csvToJson(inFile, outFile): 
    out = None; 

    with open(inFile, 'r') as csvFile: 
     #Note this reads the first line as the keys we can add specific keys with: 
     #csv.DictReader(csvFile, fieldnames=<LIST HERE>, restkey=None, restval=None,) 
     csvDict = csv.DictReader(csvFile, restkey=None, restval=None,) 
     out = [obj for obj in csvDict] 

    if out: 
     with open(outFile, 'w') as jsonFile: 
      jsonFile.write(json.dumps(out)); 
    else: 
     print "Error creating csv dict!" 

if __name__ == "__main__": 
    import argparse 

    parser = argparse.ArgumentParser() 
    parser.add_argument('inFile', nargs=1, help="Choose the in file to use") 
    parser.add_argument('outFile', nargs=1, help="Choose the out file to use") 
    args = parser.parse_args() 
    csvToJson(args.inFile[0] , args.outFile[0]); 
2
import csv 
import json 
reader = csv.reader(f, delimiter=',', quotechar='"') 
keys = next(reader) #skip the headers 
out = [{key: val for key, val in zip(keys, prop)} for prop in reader] 
json.dumps(out) 
+0

Me gusta mucho su solución ... solo para nuevo en python debería ser mejor si explica que f es: f = open ('/ path/file', 'r') –

Cuestiones relacionadas