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)
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)