Python에서 JSON 병합
이 자습서에서는 조건문, 루프 및 Python의 type()
함수를 사용하여 JSON을 평면화하는 방법에 대해 설명합니다.
Python에서 JSON 병합
JSON은 파일 형식이며 JavaScript Object Notation을 나타냅니다. JSON은 사람이 읽고 이해할 수 있는 데이터를 저장하고 전송합니다.
JSON 파일에서 배열 또는 목록으로 구분된 값을 가진 다양한 속성을 볼 수 있습니다. 예를 들어 JSON 파일을 사용하여 이름, 나이, 주소 및 클래스와 같은 학생 데이터를 저장할 수 있습니다.
각 학생의 데이터는 다양한 데이터 유형의 속성과 값을 포함하는 배열에 저장됩니다. 예를 들어 JSON 파일의 예는 다음과 같습니다.
{"Ali" : {
"age": 18,
"profession": "student"},
"Ammar" : {
"age" : "nineteen",
"profession": "mechanic"}
}
위 파일에는 두 사람에 대한 정보가 포함되어 있으며 Python의 json
라이브러리를 사용하여 읽을 수 있습니다. 예를 들어 json
라이브러리를 사용하여 위의 파일을 읽고 해당 내용을 표시합니다.
아래 코드를 참조하십시오.
import json
json_file = open("people.json")
data = json.load(json_file)
print("Original Data\n", data)
출력:
Original Data
{'Ali': {'age': 18, 'profession': 'student'}, 'Ammar': {'age': 'nineteen', 'profession': 'mechanic'}}
open()
함수에서 파일 이름과 확장자를 제공해야 파일을 읽을 수 있으며 파일이 Python 파일과 동일한 디렉토리에 있지 않은 경우 파일의 전체 경로와 함께 제공해야 합니다. open()
함수 내부의 이름 및 확장자. JSON 데이터를 읽기 위해 json
라이브러리의 load()
함수를 사용했습니다.
data['Ali']
와 같이 데이터 변수 내에서 그의 이름을 사용하여 한 사람의 데이터를 얻을 수 있습니다. 대량의 데이터가 포함된 다단계 JSON 파일이 있는 경우 특정 속성의 값을 읽기가 어려워집니다.
다단계 JSON 파일 내부에는 목록 또는 dicts
와 같은 다른 속성 내부에 속성이 있습니다. 다중 레벨 JSON 파일을 단일 레벨로 변환하려는 경우 속성 이름을 결합할 수 있습니다.
예를 들어 위의 코드에서 Ali
의 나이를 얻으려면 data['Ali']['age']
를 사용하여 액세스할 수 있지만 속성 이름을 결합하면 다음을 사용할 수 있습니다. data['Ali_age']
는 Ali
의 나이를 가져옵니다.
JSON 데이터를 평면화하기 위해 자신을 여러 번 호출하는 재귀 함수를 사용할 수 있습니다. JSON 파일에서 데이터를 읽고 두 개의 루프를 사용하여 데이터에서 list
및 dict
를 확인해야 합니다.
루프를 사용하여 속성 이름을 구분 기호와 결합하고 해당 값을 dict
형식으로 저장합니다. JSON 파일에 더 이상 데이터가 없으면 루프가 중지되고 결과가 반환됩니다.
예를 들어 위의 JSON 파일을 병합해 보겠습니다. 아래 코드를 참조하십시오.
import json
json_file = open("people.json")
data = json.load(json_file)
print("Original Data\n", data)
def flatten_json_data(json_data):
out = {}
def flatten_json(d, name=""):
if type(d) is dict:
for a in d:
flatten_json(d[a], name + a + "_")
elif type(d) is list:
i = 0
for a in d:
flatten_json(a, name + str(i) + "_")
i += 1
else:
out[name[:-1]] = d
flatten_json(json_data)
return out
flattened_data = flatten_json_data(data)
print("\nflatten Data\n", flattened_data)
출력:
Original Data
{'Ali': {'age': 18, 'profession': 'student'}, 'Ammar': {'age': 'nineteen', 'profession': 'mechanic'}}
flatten Data
{'Ali_age': 18, 'Ali_profession': 'student', 'Ammar_age': 'nineteen', 'Ammar_profession': 'mechanic'}
위의 코드에서는 if-else
조건문을 사용하여 입력 데이터 유형을 확인하고 type()
함수는 객체의 데이터 유형을 반환합니다. 데이터를 읽는 동안 dict
가 오면 첫 번째 루프가 작동합니다. 목록이 오면 두 번째 루프가 작동합니다.
위의 출력에서 원래 데이터에는 두 개의 dicts
가 포함되어 있지만 평면화된 데이터에는 dict
가 하나만 포함되어 있음을 알 수 있습니다. 예제 JSON 파일에는 목록이 포함되어 있지 않지만 위의 코드는 목록이 포함된 JSON 파일에서도 작동합니다.
원본 데이터와 평면화된 데이터에는 차이가 있습니다. 나이와 직업은 사람의 이름인 동일한 부모 속성을 가지므로 원본 데이터를 사용하여 사람의 나이와 직업을 동시에 얻을 수 있지만 평면화 된 데이터를 사용하여 동일하게 할 수는 없습니다.
평면화된 데이터를 사용하여 사람의 나이와 직업을 얻으려면 하나씩 따로 가져와야 합니다.
평면화된 JSON 파일은 단일 값만 가져와야 하는 경우에 유용하지만 객체 또는 속성에 대한 모든 정보를 얻으려면 원본 JSON 파일을 사용할 수 있습니다. JSON 라이브러리에 대한 자세한 내용은 이 링크를 확인하십시오.