[python] 여러 JSON 개체가있는 JSON 파일로드 및 구문 분석
Python 에서 JSON 파일을로드하고 구문 분석하려고합니다 . 하지만 파일을로드하려고 해요.
import json
json_data = open('file')
data = json.load(json_data)
수율 :
ValueError: Extra data: line 2 column 1 - line 225116 column 1 (char 232 - 160128774)
나는 18.2를json
보았다 . — Python 문서에 JSON 인코더와 디코더 가 있지만이 끔찍한 문서를 읽는 것은 매우 실망 스럽습니다.
처음 몇 줄 (무작위 항목으로 익명 처리됨) :
{"votes": {"funny": 2, "useful": 5, "cool": 1}, "user_id": "harveydennis", "name": "Jasmine Graham", "url": "http://example.org/user_details?userid=harveydennis", "average_stars": 3.5, "review_count": 12, "type": "user"}
{"votes": {"funny": 1, "useful": 2, "cool": 4}, "user_id": "njohnson", "name": "Zachary Ballard", "url": "https://www.example.com/user_details?userid=njohnson", "average_stars": 3.5, "review_count": 12, "type": "user"}
{"votes": {"funny": 1, "useful": 0, "cool": 4}, "user_id": "david06", "name": "Jonathan George", "url": "https://example.com/user_details?userid=david06", "average_stars": 3.5, "review_count": 12, "type": "user"}
{"votes": {"funny": 6, "useful": 5, "cool": 0}, "user_id": "santiagoerika", "name": "Amanda Taylor", "url": "https://www.example.com/user_details?userid=santiagoerika", "average_stars": 3.5, "review_count": 12, "type": "user"}
{"votes": {"funny": 1, "useful": 8, "cool": 2}, "user_id": "rodriguezdennis", "name": "Jennifer Roach", "url": "http://www.example.com/user_details?userid=rodriguezdennis", "average_stars": 3.5, "review_count": 12, "type": "user"}
답변
당신은이 JSON 라인 형식의 텍스트 파일을 . 파일을 한 줄씩 구문 분석해야합니다.
import json
data = []
with open('file') as f:
for line in f:
data.append(json.loads(line))
각 줄 에는 유효한 JSON이 포함되어 있지만 전체적으로 최상위 목록이나 개체 정의가 없기 때문에 유효한 JSON 값이 아닙니다.
파일에 한 줄에 JSON이 포함되어 있기 때문에 한 번에 모든 것을 파싱하거나 스트리밍 JSON 파서를 찾아야하는 번거 로움을 덜 수 있습니다. 이제 다음으로 이동하기 전에 각 라인을 개별적으로 처리하도록 선택하여 프로세스에서 메모리를 절약 할 수 있습니다. 각 결과를 하나의 목록에 추가 한 다음 파일이 정말 큰 경우 모든 것을 처리 하고 싶지는 않을 것입니다 .
구분 기호가 중간에있는 개별 JSON 개체가 포함 된 파일이있는 경우 ‘json’모듈을 사용하여 한 번에 하나의 JSON 개체를 읽으려면 어떻게해야합니까? 버퍼링 된 메서드를 사용하여 개별 개체를 구문 분석합니다.
답변
이 질문에 걸림돌이되는 사람들을 위해 : 파이썬 jsonlines
라이브러리 (이 질문보다 훨씬 어린)는 한 줄에 하나의 json 문서로 파일을 우아하게 처리합니다. 참조 https://jsonlines.readthedocs.io/를
답변
즉 입니다 잘못 포맷. 한 줄에 하나의 JSON 개체가 있지만 더 큰 데이터 구조 (예 : 배열)에 포함되어 있지 않습니다. 각 줄의 끝에 쉼표로 시작 [
하고 끝나 도록 형식을 다시 지정 ]
하거나 별도의 사전으로 한 줄씩 구문 분석해야합니다.