큰 파일에서 줄 구분된 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
'programing' 카테고리의 다른 글
| "최상위 레벨 JSON 어레이"란 무엇이며, 이러한 어레이가 보안상의 리스크가 되는 이유는 무엇입니까? (0) | 2023.04.04 |
|---|---|
| 맵 또는 속성 개체로 모든 환경 속성에 액세스 (0) | 2023.04.04 |
| Woocommerce - Product 페이지 - "Add To Cart" 버튼에서 AJAX를 작성하는 방법 (0) | 2023.04.04 |
| 데이터베이스 대 데이터베이스로 S3 사용(예: MongoDB) (0) | 2023.03.25 |
| 어떻게 하면 자바스크립트 문자열에서 앰퍼샌드를 이스케이프하여 페이지가 strict를 검증할 수 있습니까? (0) | 2023.03.25 |