Aquí'está mi código, cosas realmente simples...
import csv
import json
csvfile = open('file.csv', 'r')
jsonfile = open('file.json', 'w')
fieldnames = ("FirstName","LastName","IDNumber","Message")
reader = csv.DictReader( csvfile, fieldnames)
out = json.dumps( [ row for row in reader ] )
jsonfile.write(out)
Declarar algunos nombres de campo, el lector utiliza CSV para leer el archivo, y los nombres de archivo para volcar el archivo a un formato JSON. Aquí'está el problema...
Cada registro del archivo CSV está en una fila diferente. Quiero que la salida JSON sea de la misma forma. El problema es que vuelca todo en una línea gigante y larga.
He intentado usar algo como for line in csvfile:
y luego ejecutar mi código debajo de eso con reader = csv.DictReader( line, fieldnames)
que hace un bucle a través de cada línea, pero hace todo el archivo en una línea, luego hace un bucle a través de todo el archivo en otra línea... continúa hasta que se queda sin líneas.
¿Alguna sugerencia para corregir esto?
Editar: Para aclarar, actualmente tengo: (cada registro en la línea 1)
[{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"},{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}]
Lo que estoy buscando: (2 registros en 2 líneas)
{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"}
{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}
No cada campo individual sangría / en una línea separada, pero cada registro en it's propia línea.
Algunos ejemplos de entrada.
"John","Doe","001","Message1"
"George","Washington","002","Message2"
El problema con la salida deseada es que no es un documento json válido, ¡es un flujo de documentos json!
Eso está bien, si es lo que necesitas, pero eso significa que para cada documento que quieras en tu salida, tendrás que llamar a json.dumps
.
Dado que la nueva línea que quiere separar sus documentos no está contenida en ellos, tendrá que proporcionarla usted mismo. Así que sólo tenemos que sacar el bucle de la llamada a json.dump e interponer nuevas líneas para cada documento escrito.
import csv
import json
csvfile = open('file.csv', 'r')
jsonfile = open('file.json', 'w')
fieldnames = ("FirstName","LastName","IDNumber","Message")
reader = csv.DictReader( csvfile, fieldnames)
for row in reader:
json.dump(row, jsonfile)
jsonfile.write('\n')
Añade el parámetro indent
a json.dumps
.
data = {'this': ['has', 'some', 'things'],
'in': {'it': 'with', 'some': 'more'}}
print(json.dumps(data, indent=4))
También tenga en cuenta que, simplemente puede utilizar json.dump
con el jsonfile
abierto:
json.dump(data, jsonfile)
import csv
import json
csvfile = csv.DictReader('filename.csv', 'r'))
output =[]
for each in csvfile:
row ={}
row['FirstName'] = each['FirstName']
row['LastName'] = each['LastName']
row['IDNumber'] = each ['IDNumber']
row['Message'] = each['Message']
output.append(row)
json.dump(output,open('filename.json','w'),indent=4,sort_keys=False)