여러 JSON 개체가있는 JSON 파일로드 및 구문 분석


101

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"}

답변:


222

당신은이 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 개체를 읽으려면 어떻게해야합니까? 버퍼링 된 메서드를 사용하여 개별 개체를 구문 분석합니다.


2
+1 모든 개체가 한 번에 필요하지 않은 경우 하나씩 처리하는 것이 더 효율적인 방법 일 수 있다는 점에 주목할 가치가 있습니다. 이렇게하면 전체 데이터를 메모리에 저장할 필요가없고 그 일부만 저장할 수 있습니다.
Tadeck

1
@Pi_ : 사전이 있으므로 필드에 키로 액세스하십시오.data = json.loads(line); print data[u'votes']
Martijn Pieters

1
@Pi_ : json.loads ()의 결과를 인쇄하거나 디버거를 사용하여 검사합니다.
Martijn Pieters

1
@Pi_ : 아니요; JSON 형식을 python dict 표현과 혼동하지 마십시오. 이제 문자열이있는 파이썬 사전을보고 있습니다.
Martijn Pieters

1
@ user2441441 : 여기 게시물에서 연결된 답변 을 참조 하십시오.
Martijn Pieters


4

입니다 잘못 포맷. 한 줄에 하나의 JSON 개체가 있지만 더 큰 데이터 구조 (예 : 배열)에 포함되어 있지 않습니다. 각 줄의 끝에 쉼표로 시작 [하고 끝나 도록 형식을 다시 지정 ]하거나 별도의 사전으로 한 줄씩 구문 분석해야합니다.


20
50MB 파일의 경우 OP는 어쨌든 한 줄씩 데이터를 처리하는 것이 더 낫습니다. :-)
Martijn Pieters

11
파일 형식이 잘못되었는지 여부는 사용자의 관점에 따라 다릅니다. "JSON 라인"형식으로 의도 된 경우 유효합니다. 참조 : jsonlines.org
LS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.