파이썬으로 데이터를 처리하다 보면 {"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()을 사용하는 것이 좋습니다. 두 방법을 상황에 맞게 활용하면 안전하고 효율적으로 데이터를 변환할 수 있습니다.