Como converter o ficheiro CSV para JSON multilinha?

Aqui's o meu código, coisas muito 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)

Declare alguns nomes de campo, o leitor usa CSV para ler o ficheiro, e os nomes dos ficheiros para descarregar o ficheiro para um formato JSON. Aqui's o problema...

Cada registo no ficheiro CSV está numa fila diferente. Quero que a saída do JSON seja da mesma forma. O problema é que a despeja toda numa linha gigante e longa.

I'tentei utilizar algo como para linha em csvfile: e depois executar o meu código abaixo disso com reader = csv.DictReader( linha, nomes de campo) que faz loops através de cada linha, mas faz o ficheiro inteiro numa linha, depois faz loops através do ficheiro inteiro noutra linha... continua até ficar sem linhas.

Alguma sugestão para corrigir isto?

Editar: Para esclarecer, tenho actualmente: (todos os registos na linha 1)

[{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"},{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}]

O que I'm procura: (2 registos em 2 linhas)

{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"}
{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}

Não cada campo individual indentado/em linha separada, mas cada registo na sua própria linha's.

Algumas amostras introduzidas.

"John","Doe","001","Message1"
"George","Washington","002","Message2"
Solução

O problema com a sua saída desejada é que não é um documento json válido; it's a stream of json documents!

Isso's ok, se é o que precisa, mas isso significa que para cada documento que quer na sua produção, você'terá de chamar `json.dumps'.

Uma vez que a nova linha que pretende separar os seus documentos não está contida nesses documentos, você'está no gancho para o fornecer você mesmo. Assim, só precisamos de retirar o laço da chamada para json.dump e interpor novas linhas 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')
Comentários (6)

Adicionar o parâmetro indent' ajson.dumps'.

 data = {'this': ['has', 'some', 'things'],
         'in': {'it': 'with', 'some': 'more'}}
 print(json.dumps(data, indent=4))

Note também que, pode simplesmente utilizar json.dump com o aberto jsonfile:

json.dump(data, jsonfile)
Comentários (1)
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)
Comentários (4)