Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 문자열로 된 딕셔너리를 실제 딕셔너리 객체로 변환하는 방법

파이썬으로 데이터를 처리하다 보면 {"Mon" : 3, "Wed" : 5}처럼 딕셔너리 형태를 띤 문자열을 실제 딕셔너리(dict) 객체로 변환해야 하는 경우가 자주 발생합니다. 예를 들어 API 응답, 설정 파일, 로그 데이터 등을 다룰 때 문자열 형태의 딕셔너리를 만나게 되는데, 이를 그대로 사용하면 키-값 쌍에 접근할 수 없습니다.

이 글에서는 문자열 딕셔너리를 정상적인 딕셔너리 객체로 변환하는 대표적인 두 가지 방법을 소개합니다.

방법 1: json.loads() 사용하기

json 모듈의 json.loads() 함수는 JSON 형식의 문자열을 파싱하여 원본 데이터의 구조를 유지한 채 파이썬 객체(딕셔너리)로 반환합니다. 문자열 딕셔너리를 이 함수에 인자로 전달하면 변환된 결과를 얻을 수 있습니다.

예제 코드

import json

stringA = '{"Mon" : 3, "Wed" : 5, "Fri" : 7}'

# 주어진 문자열 출력
print("입력 문자열 :\n", stringA)

# json.loads()를 사용하여 변환
res = json.loads(stringA)

# 결과 확인
print("변환된 딕셔너리 :\n", res)
print(type(res))  # <class 'dict'>

실행 결과

입력 문자열 :
{"Mon" : 3, "Wed" : 5, "Fri" : 7}
변환된 딕셔너리 :
{'Mon': 3, 'Wed': 5, 'Fri': 7}
<class 'dict'>

출력 결과를 보면 문자열이 실제 딕셔너리 객체로 성공적으로 변환되었음을 알 수 있습니다. 이제 res['Mon']과 같이 키를 통해 값에 접근할 수 있습니다.

방법 2: ast.literal_eval() 사용하기

ast(Abstract Syntax Tree) 모듈의 literal_eval() 함수도 위 방법과 유사하게 동작합니다. 이 함수는 문자열을 파이썬 리터럴 표현식으로 안전하게 평가하여 일반 딕셔너리로 변환해 줍니다.

예제 코드

import ast

stringA = '{"Mon" : 3, "Wed" : 5, "Fri" : 7}'

# 주어진 문자열 출력
print("입력 문자열 :\n", stringA)

# ast.literal_eval()을 사용하여 변환
res = ast.literal_eval(stringA)

# 결과 확인
print("변환된 딕셔너리 :\n", res)
print(type(res))  # <class 'dict'>

실행 결과

입력 문자열 :
{"Mon" : 3, "Wed" : 5, "Fri" : 7}
변환된 딕셔너리 :
{'Mon': 3, 'Wed': 5, 'Fri': 7}
<class 'dict'>

두 방법의 차이점 비교

두 방법 모두 같은 결과를 내지만, 상황에 따라 적합한 도구가 다릅니다.

  • json.loads(): 엄격한 JSON 문법만 지원합니다. 키와 문자열 값은 반드시 큰따옴표(")로 묶여 있어야 하며, 작은따옴표가 포함된 문자열은 JSONDecodeError를 발생시킵니다. 외부에서 받은 표준 JSON 데이터를 처리할 때 가장 적합합니다.
  • ast.literal_eval(): 파이썬 리터럴 문법 전반을 지원합니다. 작은따옴표, 튜플, 집합(set), None, True/False 등도 처리할 수 있어 파이썬 코드에서 생성된 문자열 표현을 변환할 때 더 유연합니다.
⚠️ 주의: 위험한 eval() 함수 대신 반드시 ast.literal_eval()을 사용하세요. eval()은 임의의 코드를 실행할 수 있어 보안 취약점이 될 수 있지만, literal_eval()은 리터럴 값만 안전하게 평가합니다.

마무리

문자열 형태의 딕셔너리를 실제 딕셔너리 객체로 변환하는 것은 데이터 전처리에서 매우 흔한 작업입니다. 표준 JSON 데이터라면 json.loads()를, 파이썬 스타일의 문자열 표현이라면 ast.literal_eval()을 사용하는 것이 좋습니다. 두 방법을 상황에 맞게 활용하면 안전하고 효율적으로 데이터를 변환할 수 있습니다.