data = [] withopen('file') as f: for line in f: data.append(json.loads(line))
Каждая строка содержит допустимый JSON, но в целом это недопустимое значение JSON, поскольку нет списка верхнего уровня или определения объекта.
Обратите внимание, что, поскольку файл содержит JSON в каждой строке, вы избавлены от головной боли, связанной с попытками проанализировать все это за один раз или разобраться с потоковым анализатором JSON. Теперь вы можете обрабатывать каждую строку отдельно, прежде чем переходить к следующей, экономя память в процессе. Вероятно, вы не захотите добавлять каждый результат в один список и затем обрабатывать все, если ваш файл действительно большой.
В случае, если вы используете pandas и вас заинтересует загрузка json файла в виде фрейма данных, вы можете использовать:
import pandas as pd df = pd.read_json('file.json', lines=True)
А чтобы преобразовать его в массив json, вы можете использовать:
df.to_json('new_file.json')
Ответ 3
для тех, кто столкнулся с этим вопросом: библиотека python jsonlines (намного моложе этого вопроса) элегантно обрабатывает файлы с одним документом json в строке. см. https://jsonlines.readthedocs.io /
Ответ 4
Точно так же, как ответ Мартина Питерса, но, возможно, немного более питонистский, и, прежде всего, позволяющий передавать данные потоком (см. Вторую часть ответа):
import json
withopen(filepath, "r") as f: returnlist(map(json.loads, f))
map(function, iterable) Функция возвращает итератор, который применяется function к каждому элементу iterable, выдавая результаты (см. map() python doc).
И list преобразует этот итератор в ... список :)
Но вы можете представить себе, что вместо этого можно напрямую использовать итератор, возвращаемый map: он выполняет итерации по каждой из ваших строк json. Обратите внимание, что в этом случае вам нужно делать это в with open(filepath, "r") as f контексте: в этом сила этого подхода, строки json не полностью загружаются в список, они передаются потоком: функция map считывает каждую строку файла, когда next(iterator) вызывается for loop.
Это дало бы:
import json
withopen(file path, "r") as f: iterator_over_lines = map(json.loads, f) # just as you would do with a list but here the file is streamed for jsonline in iterator_over_lines: # do something for each line # the function mapped, json.loads is only call on each iteration # that's why the file must stay opened
# You can try to call yourself the next function used by the for loop: next_jsonline = next(iterator_over_lines) nextnext_jsonline = next(iterator_over_lines)
И мне нечего добавить к ответу Martijn для объяснений о том, что такое jsonl (файл json построчно) и зачем его использовать!