read_json read python json csv

python - read_json - pandas read json



¿Cómo convertir archivos CSV a JSON multilínea? (10)

¿Qué tal si usamos Pandas para leer el archivo csv en un DataFrame ( pd.read_csv ), luego manipulamos las columnas si queremos (descartarlas o actualizar valores) y finalmente convertir el DataFrame a JSON ( pd.DataFrame.to_json ).

Nota: No he comprobado cuán eficiente será, pero definitivamente esta es una de las maneras más fáciles de manipular y convertir un csv grande en json.

Esta pregunta ya tiene una respuesta aquí:

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)

Declare algunos nombres de campo, el lector usa CSV para leer el archivo y los nombres archivados para volcar el archivo a un formato JSON. Aquí está el problema ...

Cada registro en el archivo CSV está en una fila diferente. Quiero que la salida JSON sea de la misma manera. El problema es que lo vuelca todo en una línea larga y gigante.

He intentado usar algo como for line in csvfile: y luego for line in csvfile: mi código debajo de eso con reader = csv.DictReader( line, fieldnames) que recorre cada línea, pero hace todo el archivo en una línea, luego pasa por el todo el archivo en otra línea ... continúa hasta que se quede 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 con sangría / en una línea separada, pero cada registro en su propia línea.

Algunos ejemplos de entrada.

"John","Doe","001","Message1" "George","Washington","002","Message2"


Agregue el parámetro de 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 usar json.dump con el jsonfile abierto:

json.dump(data, jsonfile)


Como leve mejora a la respuesta @MONTYHS, iterando a través de un tup de nombres de campo:

import csv import json csvfilename = ''filename.csv'' jsonfilename = csvfilename.split(''.'')[0] + ''.json'' csvfile = open(csvfilename, ''r'') jsonfile = open(jsonfilename, ''w'') reader = csv.DictReader(csvfile) fieldnames = (''FirstName'', ''LastName'', ''IDNumber'', ''Message'') output = [] for each in reader: row = {} for field in fieldnames: row[field] = each[field] output.append(row) json.dump(output, jsonfile, indent=2, sort_keys=True)


El problema con su salida deseada es que no es un documento válido,; ¡es una secuencia de documentos json !

Está bien, si es lo que necesita, pero eso significa que para cada documento que desee en su salida, tendrá que llamar a json.dumps .

Como la nueva línea que desea separar sus documentos no está incluida en esos documentos, usted está en el gancho de suministrarla usted mismo. Así que solo tenemos que sacar el bucle de la llamada a json.dump e intercalar líneas nuevas 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'')


Puede usar Pandas DataFrame para lograr esto, con el siguiente ejemplo:

import pandas as pd csv_file = pd.DataFrame(pd.read_csv("path/to/file.csv", sep = ",", header = 0, index_col = False)) csv_file.to_json("/path/to/new/file.json", orient = "records", date_format = "epoch", double_precision = 10, force_ascii = True, date_unit = "ms", default_handler = None)


Puedes intentar this

import csvmapper # how does the object look mapper = csvmapper.DictMapper([ [ { ''name'' : ''FirstName''}, { ''name'' : ''LastName'' }, { ''name'' : ''IDNumber'', ''type'':''int'' }, { ''name'' : ''Messages'' } ] ]) # parser instance parser = csvmapper.CSVParser(''sample.csv'', mapper) # conversion service converter = csvmapper.JSONConverter(parser) print converter.doConvert(pretty=True)

Editar:

Enfoque más simple

import csvmapper fields = (''FirstName'', ''LastName'', ''IDNumber'', ''Messages'') parser = CSVParser(''sample.csv'', csvmapper.FieldMapper(fields)) converter = csvmapper.JSONConverter(parser) print converter.doConvert(pretty=True)


Tomé la respuesta de SingleNegationElimination y la simplifiqué en un juego de tres líneas que se puede usar en una cartera de proyectos:

import csv import json import sys for row in csv.DictReader(sys.stdin): json.dump(row, sys.stdout) sys.stdout.write(''/n'')


Veo que esto es antiguo, pero necesitaba el código de SingleNegationElimination, sin embargo, tuve problemas con los datos que no contenían caracteres utf-8. Estos aparecieron en campos que no me preocupaban demasiado, así que opté por ignorarlos. Sin embargo, eso tomó un poco de esfuerzo. Soy nuevo en Python, así que con un poco de prueba y error lo hice funcionar. El código es una copia de SingleNegationElimination con el manejo adicional de utf-8. Traté de hacerlo con https://docs.python.org/2.7/library/csv.html pero finalmente me di por vencido. El siguiente código funcionó.

import csv, json csvfile = open(''file.csv'', ''r'') jsonfile = open(''file.json'', ''w'') fieldnames = ("Scope","Comment","OOS Code","In RMF","Code","Status","Name","Sub Code","CAT","LOB","Description","Owner","Manager","Platform Owner") reader = csv.DictReader(csvfile , fieldnames) code = '''' for row in reader: try: print(''+'' + row[''Code'']) for key in row: row[key] = row[key].decode(''utf-8'', ''ignore'').encode(''utf-8'') json.dump(row, jsonfile) jsonfile.write(''/n'') except: print(''-'' + row[''Code'']) raise


import csv import json file = ''csv_file_name.csv'' json_file = ''output_file_name.json'' #Read CSV File def read_CSV(file, json_file): csv_rows = [] with open(file) as csvfile: reader = csv.DictReader(csvfile) field = reader.fieldnames for row in reader: csv_rows.extend([{field[i]:row[field[i]] for i in range(len(field))}]) convert_write_json(csv_rows, json_file) #Convert csv data into json def convert_write_json(data, json_file): with open(json_file, "w") as f: f.write(json.dumps(data, sort_keys=False, indent=4, separators=('','', '': ''))) #for pretty f.write(json.dumps(data)) read_CSV(file,json_file)

Documentación de json.dumps ()


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)