HOWTO · Python

Python에서 파일에 사전 저장

이 튜토리얼은 Python에서 파일에 사전을 저장하는 방법을 보여줍니다.

이 페이지의 내용

Python 딕셔너리를 저장한 뒤 나중에 읽으려면 데이터를 어떻게 사용할지에 따라 형식을 선택하세요. 여러 언어에서 사용할 수 있고 사람이 읽기 쉬운 파일이 필요하며 값이 JSON과 호환된다면 JSON을 사용하세요. Python 객체를 저장하고 파일을 신뢰할 수 있는 출처에서만 불러온다면 pickle을 사용하세요. 이미 NumPy를 사용하는 작업 흐름이라면 NumPy의 .npy 형식을 사용할 수 있습니다. 아래 각 예제는 파일에 데이터를 쓰고 딕셔너리를 다시 읽습니다.

Python에서 pickle 모듈의 dump 함수로 딕셔너리를 파일에 저장하기

pickle 모듈은 Python 객체를 Python 전용 바이너리 형식으로 저장합니다. 다음 예제는 pickle.dump()로 딕셔너리를 쓰고 pickle.load()로 읽습니다. 바이트를 쓸 때는 wb, 읽을 때는 rb를 사용합니다. 임시 디렉터리를 사용하므로 예제를 자체적으로 실행할 수 있습니다.

import pickle
from pathlib import Path
from tempfile import TemporaryDirectory

my_dict = {"Apple": 4, "Banana": 2, "Orange": 6, "Grapes": 11}

with TemporaryDirectory() as directory:
    file_path = Path(directory) / "myDictionary.pkl"
    with file_path.open("wb") as file:
        pickle.dump(my_dict, file)

    with file_path.open("rb") as file:
        new_dict = pickle.load(file)

    print(new_dict)
{'Apple': 4, 'Banana': 2, 'Orange': 6, 'Grapes': 11}

신뢰할 수 있는 출처의 pickle 파일만 불러오세요. 역직렬화 과정에서 코드가 실행될 수 있습니다. Python 전용 직렬화를 사용해도 괜찮을 때 pickle이 유용하지만, 여러 시스템 간에 데이터를 주고받기 위한 이식성 있는 형식은 아닙니다.

Python에서 NumPy 라이브러리의 save 함수로 딕셔너리를 파일에 저장하기

프로젝트에서 이미 NumPy를 사용한다면 np.save()로 딕셔너리를 .npy 객체 배열에 저장할 수 있습니다. 객체 데이터를 불러오려면 allow_pickle=True가 필요합니다. 불러온 0차원 배열에 .item()을 호출하면 딕셔너리를 얻을 수 있습니다. 이 방식도 pickle 데이터 로드에 따른 신뢰 위험이 있습니다. NumPy를 설치해야 합니다.

import numpy as np
from pathlib import Path
from tempfile import TemporaryDirectory

my_dict = {"Apple": 4, "Banana": 2, "Orange": 6, "Grapes": 11}

with TemporaryDirectory() as directory:
    file_path = Path(directory) / "dictionary.npy"
    np.save(file_path, my_dict)
    new_dict = np.load(file_path, allow_pickle=True).item()
    print(new_dict)
{'Apple': 4, 'Banana': 2, 'Orange': 6, 'Grapes': 11}

Python에서 json 모듈의 dump 함수로 딕셔너리를 파일에 저장하기

다른 언어와 주고받을 수 있는 읽기 쉬운 파일이 필요하다면 딕셔너리에 JSON 호환 값이 들어 있을 때 Python 내장 json 모듈을 사용하세요. json.dump()는 텍스트 파일에 쓰고 json.load()는 파일을 다시 읽습니다. 컨텍스트 관리자를 사용하면 작업 중 오류가 발생해도 각 파일이 닫힙니다. JSON은 임의의 Python 객체나 모든 Python 타입을 그대로 보존하지 않습니다. 예를 들어 사용자 정의 클래스는 명시적인 변환 방법이 필요합니다.

import json
from pathlib import Path
from tempfile import TemporaryDirectory

my_dict = {"Apple": 4, "Banana": 2, "Orange": 6, "Grapes": 11}

with TemporaryDirectory() as directory:
    file_path = Path(directory) / "myDictionary.json"
    with file_path.open("w", encoding="utf-8") as file:
        json.dump(my_dict, file)

    with file_path.open("r", encoding="utf-8") as file:
        new_dict = json.load(file)

    print(new_dict)
{'Apple': 4, 'Banana': 2, 'Orange': 6, 'Grapes': 11}