programing

Python을 JSONL로 변환

lastmoon 2023. 3. 18. 09:18
반응형

Python을 JSONL로 변환

표준 JSON 개체를 각 행에 개별적이고 자체 포함된 유효한 JSON 개체를 포함해야 하는 개체로 조작하려고 합니다.'JSON 회선' 참조

JSON_file =

[{u'index': 1,
  u'no': 'A',
  u'met': u'1043205'},
 {u'index': 2,
  u'no': 'B',
  u'met': u'000031043206'},
 {u'index': 3,
  u'no': 'C',
  u'met': u'0031043207'}]

To JSONL:

{u'index': 1, u'no': 'A', u'met': u'1043205'}
{u'index': 2, u'no': 'B', u'met': u'031043206'}
{u'index': 3, u'no': 'C', u'met': u'0031043207'}

현재 솔루션은 JSON 파일을 텍스트 파일로 읽고[처음부터 끝까지]마지막부터.따라서 행을 포함하는 중첩 객체가 아니라 각 행에 유효한 JSON 객체를 작성합니다.

좀 더 우아한 해결책은 없을까?파일에 문자열 조작을 하면 뭔가 잘못될 수 있을 것 같아요.

그 동기는 책을 읽는 것이다.json파일을 Spark의 RDD에 저장합니다.관련 질문 - Apache Spark로 JSON 읽기 - 'corrupt_record' 참조

입력한 내용은 일련의 Python 개체로 보입니다. JSON 문서가 아닙니다.

Python 딕셔너리 목록이 있는 경우 각 엔트리를 파일에 따로 덤프한 후 줄바꿈만 하면 됩니다.

import json

with open('output.jsonl', 'w') as outfile:
    for entry in JSON_file:
        json.dump(entry, outfile)
        outfile.write('\n')

의 디폴트 설정json모듈은 줄 바꿈 없이 JSON을 출력합니다.

고객님의A,B그리고.C이름은 실제로 다음과 같은 문자열입니다.

{"index": 1, "met": "1043205", "no": "A"}
{"index": 2, "met": "000031043206", "no": "B"}
{"index": 3, "met": "0031043207", "no": "C"}

엔트리의 리스트를 포함한 JSON 문서로 시작한 경우는, 다음의 순서로 그 문서를 해석해 주세요.json.load()/json.loads().

jsonlines 패키지는 사용 사례에 맞게 제작되었습니다.

import jsonlines

items = [
    {'a': 1, 'b': 2},
    {'a', 123, 'b': 456},
]
with jsonlines.open('output.jsonl', 'w') as writer:
    writer.write_all(items)

(네, 당신이 처음 질문을 올린 지 몇 년이 지난 후에 썼어요.)

이를 위한 간단한 방법은jq명령어를 입력합니다.

인스톨 하려면jqDebian 및 파생상품:

$ sudo apt-get install jq

CentOS/RHEL 사용자는 다음을 수행해야 합니다.

$ sudo yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo yum install jq -y

기본 사용:

$ jq -c '.[]' some_json.json >> output.jsonl

대용량 파일을 취급해야 하는 경우--stream깃발. 이렇게 하면jq스트리밍 모드에서 json을 구문 분석합니다.

$ jq -c --stream '.[]' some_json.json >> output.json

그러나 이 작업을 python 파일로 수행해야 하는 경우bigjson스트리밍 모드에서 JSON을 해석하는 편리한 라이브러리:

$ pip3 install bigjson

대용량 json을 읽는 방법(내 경우 40GB)

import bigjson

# Reads json file in streaming mode
with open('input_file.json', 'rb') as f:
    json_data = bigjson.load(f)

    # Open output file  
    with open('output_file.jsonl', 'w') as outfile:
        # Iterates over input json
        for data in json_data:
            # Converts json to a Python dict  
            dict_data = data.to_python()
            
            # Saves the output to output file
            outfile.write(json.dumps(dict_data)+"\n")

필요에 따라서, 퍼포먼스를 향상시키기 위해서, 이 코드를 병행해 주세요.결과를 여기에 투고합니다. : )

문서 및 소스 코드:https://github.com/henu/bigjson

라이브러리를 원하지 않으면 json을 직접 사용할 수 있습니다.

원천

[
    {"index": 1,"no": "A","met": "1043205"},
    {"index": 2,"no": "B","met": "000031043206"},
    {"index": 3,"no": "C","met": "0031043207"}
]

코드

import json

with open("test.json", 'r') as infile:
    data = json.load(infile)
    if len(data) > 0:
        print(json.dumps([t for t in data[0]]))
        for record in data:
            print(json.dumps([v for (k,v) in record.items()]))

결과

["index", "no", "met"]
[1, "A", "1043205"]
[2, "B", "000031043206"]
[3, "C", "0031043207"]

jsonl은 압축된 json입니다.공백 없이 구분 기호를 전달해야 할 수 있습니다.

with open(output_file_jsonl, 'a', encoding ='utf8') as json_file:
    for elem in rs:
        json_file.write(json.dumps(dict(elem), separators=(',', ':'), cls=DateTimeEncoder))
        json_file.write('\n')

이것은 JSONL 파일에 특수 기호가 있거나 다른 알파벳을 사용할 가능성을 고려한 이 답변의 편집입니다.예를 들어, 나는 키릴 문자를 사용하고 키릴 문자를 사용하지 않는다.encoding ★★★★★★★★★★★★★★★★★」ensure_ascii파라미터가 편집되면 정말 나쁜 결과가 나옵니다.도움이 될 것 같아서요

with open('output.jsonl', 'w', encoding='utf8') as outfile:
    for entry in dataset_donut:
        json.dump(entry, outfile, ensure_ascii=False)
        outfile.write('\n')

언급URL : https://stackoverflow.com/questions/38915183/python-conversion-from-json-to-jsonl

반응형