Cada línea es JSON válida, pero necesito que el archivo completo sea JSON válido.
Tengo algunos datos que se agregan desde un servicio web y se vuelcan en un archivo, por lo que es JSON-eaque, pero no es JSON válido, por lo que no se puede procesar de la manera simple e intuitiva que pueden hacerlo los archivos JSON. Dolor en el cuello , se ve (más o menos) así:
{"record":"value0","block":"0x79"} {"record":"value1","block":"0x80"}
He estado intentando reinterpretarlo como JSON válido, mi último bash se parece a esto:
with open('toy.json') as inpt: lines = [] for line in inpt: if line.startswith('{'): # block starts lines.append(line)
Sin embargo, como probablemente pueda deducir por el hecho de que estoy planteando esta pregunta, eso no funciona, ¿alguna idea sobre cómo podría abordar este problema?
EDITAR:
Intenté esto:
with open('toy_two.json', 'rb') as inpt: lines = [json.loads(line) for line in inpt] print(lines['record'])
pero consiguió el siguiente error:
Traceback (most recent call last): File "json-ifier.py", line 38, in print(lines['record']) TypeError: list indices must be integers, not str
Idealmente, me gustaría interactuar con él como pueda con JSON normal, es decir, data['value']
Editar II
with open('transactions000000000029.json', 'rb') as inpt: lines = [json.loads(line) for line in inpt] for line in lines: records = [item['hash'] for item in lines] for item in records: print item
Esto parece NDJSON con el que he estado trabajando recientemente. La especificación está aquí y no estoy seguro de su utilidad. ¿Funciona lo siguiente?
with open('the file.json', 'rb') as infile: data = infile.readlines() data = [json.loads(item.replace('\n', '')) for item in data]
Esto debería darle una lista de diccionarios.
Cada línea parece un documento JSON válido.
Es el formato de “Líneas JSON” ( http://jsonlines.org/ )
Intente procesar cada línea de forma independiente ( json.loads(line)
) o utilice una biblioteca especializada ( https://jsonlines.readthedocs.io/en/latest/ ).
def process(oneline): # do what you want with each line print(oneline['record']) with open('toy_two.json', 'rb') as inpt: for line in inpt: process(json.loads(line))