Hvordan konvertere en CSV-fil til JSON med flere linjer?

Her er koden min, veldig enkle greier...

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)

Deklarer noen feltnavn, leseren bruker CSV til å lese filen, og filnavnene til å dumpe filen til et JSON-format. Her er problemet...

Hver post i CSV-filen er på hver sin rad. Jeg vil at JSON-utdataene skal være på samme måte. Problemet er at den dumper alt på én stor, lang linje.

Jeg har prøvd å bruke noe sånt som for line in csvfile: og deretter kjøre koden min under det med reader = csv.DictReader( line, fieldnames) som løper gjennom hver linje, men den gjør hele filen på en linje, deretter løper den gjennom hele filen på en annen linje ... fortsetter til den går tom for linjer.

Har du noen forslag til hvordan dette kan korrigeres?

Redigering: For å klargjøre, for øyeblikket har jeg: (hver post på linje 1)

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

Det jeg leter etter: (2 poster på 2 linjer)

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

Ikke hvert enkelt felt innrykket/på en egen linje, men hver post på sin egen linje.

Noen eksempler på inndata.

"John","Doe","001","Message1"
"George","Washington","002","Message2"
Løsning

Problemet med den ønskede utdataen er at det ikke er et gyldig json-dokument, det er en strøm av json-dokumenter!

Det er greit, hvis det er det du trenger, men det betyr at du må kalle json.dumps for hvert dokument du vil ha i utdataene dine.

Siden den nye linjen du vil ha mellom dokumentene ikke finnes i disse dokumentene, må du selv sørge for den. Så vi trenger bare å trekke løkken ut av anropet til json.dump og legge inn nye linjer for hvert dokument som skrives.

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')
Kommentarer (6)

Legg til parameteren indent i json.dumps.

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

Merk også at du ganske enkelt kan bruke json.dump med den åpne jsonfile:

json.dump(data, jsonfile)
Kommentarer (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)
Kommentarer (4)