programing

큰 파일에서 줄 구분된 JSON을 읽는 방법(한 줄씩)

nicegoodjob 2023. 4. 4. 22:53
반응형

큰 파일에서 줄 구분된 JSON을 읽는 방법(한 줄씩)

줄 바꿈으로 구분된 JSON 문자열로 채워진 큰 파일(2GB 크기)을 로드하려고 합니다.예:

{
    "key11": value11,
    "key12": value12,
}
{
    "key21": value21,
    "key22": value22,
}
…

현재 Import 방법은 다음과 같습니다.

content = open(file_path, "r").read() 
j_content = json.loads("[" + content.replace("}\n{", "},\n{") + "]")

이것은 해킹처럼 보입니다(각 JSON 문자열 사이에 쉼표를 추가하고 올바른 목록으로 만들기 위해 시작과 끝의 각 괄호를 추가합니다).

딜리미터( JSON "(newline)"를 하는 더 ?\n,

ㅇㅇㅇㅇ.Python작성된 에 대해 를 적절히 수 것 각 2GB의 메모리를 하는 방법이 ?각각의 데이터를 구성하는 방법이 있습니까?JSON파일을 한 줄 한 줄 읽고 있는 동안 어떤 일이 일어났을까요?★★★★★★★★★★★★★★★★★★!

각 행을 읽고 json 개체를 생성하기만 하면 됩니다.

with open(file_path) as f:
    for line in f:
        j_content = json.loads(line)

하면 오브젝트를 합니다('json'이 ).\n객체의 에서 또는 하여 각 필요할 때할 수 있습니다.json은 json json을 사용합니다.

다음 답변도 있습니다.

https://stackoverflow.com/a/7795029/671543

contents = open(file_path, "r").read() 
data = [json.loads(str(item)) for item in contents.strip().split('\n')]

지정한 특정 파일 형식에 대해 작동합니다.포맷으로 동작합니다.형식이 변경되면 행 구문 분석 방법을 변경해야 합니다.

{
    "key11": 11,
    "key12": 12
}
{
    "key21": 21,
    "key22": 22
}

한 줄 한 줄 읽기만 하면 JSON 블록을 만들 수 있습니다.

with open(args.infile, 'r') as infile:

    # Variable for building our JSON block
    json_block = []

    for line in infile:

        # Add the line to our JSON block
        json_block.append(line)

        # Check whether we closed our JSON block
        if line.startswith('}'):

            # Do something with the JSON dictionary
            json_dict = json.loads(''.join(json_block))
            print(json_dict)

            # Start a new block
            json_block = []

모든 것을 메모리에 저장하지 않고 하나의 매우 큰 JSON 파일을 해석하는 경우 json.load API의 object_hook 또는 object_pairs_hook 콜백 메서드를 사용하는 것을 검토해 주십시오.

이에 따라 Cohen의 답변이 확대됩니다.

content_object = s3_resource.Object(BucketName, KeyFileName)
file_buffer = io.StringIO()
file_buffer = content_object.get()['Body'].read().decode('utf-8')

json_lines = []
for line in file_buffer.splitlines():
    j_content = json.loads(line)
    json_lines.append(j_content)

df_readback = pd.DataFrame(json_lines)

이것은, 파일 전체가 메모리에 들어가는 것을 전제로 하고 있습니다.크기가 너무 크면 청크로 읽거나 Dask를 사용하도록 수정해야 합니다.

AWS S3에서 데이터를 읽고 줄바꿈으로 구분된 jsonl 파일을 해석해야 했습니다.내 해결책은 이 방법을 사용하는 것이었다.splitlines

코드:

for line in json_input.splitlines():
     one_json = json.loads(line)

위의 답변 중 일부에서 언급한 바와 같이 행별 읽기 접근법이 좋습니다.

, 복수의 「」에 「」가 됩니다.JSON트리 구조를 2개의 함수로 분해하여 보다 강력한 오류 처리를 할 것을 권장합니다.

예를들면,

def load_cases(file_name):
    with open(file_name) as file:
        cases = (parse_case_line(json.loads(line)) for line in file)
        cases = filter(None, cases)
        return list(cases)

parse_case_line는 regex 매칭이나 어플리케이션 고유의 요건 등 위의 예에서 필요한 키 해석 로직을 캡슐화할 수 있습니다.해석할 json 키 값을 선택할 수도 있습니다.

이 접근법의 또 다른 장점은filter복수 처리\n파일 전체를 해석합니다. :-) 파일 전체를 해석합니다.

한 줄 한 줄 읽고 스트림을 해석하는 것만으로, 파일이 1GB를 넘으면 전체 콘텐츠가 RAM에 저장되므로 해킹 트릭(각 JSON 문자열과 시작 및 끝 각 괄호 추가)이 메모리에 적합하지 않습니다.

언급URL : https://stackoverflow.com/questions/21533894/how-to-read-line-delimited-json-from-large-file-line-by-line

반응형