2021. 1. 24. 18:23

[python]str을 dict로 바꾸는 두 가지 방법

dict는 string으로 변경할 수 있는 데, string은 dict로 변경할 수 없다


dict1 = {"a":"b", "c":"d"}

str1 = str(dict1)
print(str1)
# 실행 결과
{"a":"b", "c":"d"}

딕셔너리 타입을 str로 형 변환을 하면 원하는 것처럼 알맞게 잘 출력한다. 하지만 이 str을 다시 딕셔너리 타입을 변경하려고 하면 에러가 발생한다.

dict1 = '{"a":1, "b":2}'
print(dict(dict1))

# 실행 결과
dictionary update sequence element #0 has length 1; 2 is required

str을 dict로 바꾸는 방법


1. string으로 형 변환된 것을 eval을 사용해서 코드화 한다.

str1 = '{"a":1, "b":2}'
print(eval(str1))
print(type(eval(str1)))
# 실행 결과
{"a":1, "b":2}
<class 'dict'>

eval은 문자로 된 것을 코드화하는 함수다. 보안 문제가 염려된다면 아래 literal_eval을 사용하자

from ast import literal_eval

str1 = '{"a":1, "b":2}'
print(literal_eval(str1))
print(type(eval(str1)))
# 실행 결과
{"a":1, "b":2}
<class 'dict'>

2. json을 핸들링 할 경우에는 json.loads를 사용해서 불러오자

import json

dic2 = '{"zdfasdf":"zxcvsddg","zxcadsf":"zxcfsd"}'
print(json.loads(dic2))

# 실행 결과
{"zdfasdf":"zxcvsddg","zxcadsf":"zxcfsd"}

하지만 주의해야할 것이 있다. json의 형식과 python의 딕셔너리의 형식이 비슷하지만 완전히 같지는 않기 때문에 호환되지 않는 점들이 몇 가지 있다.

예를 들면 파이썬에서는 boolean을 False, True로 표현하지만 json에서는 소문자로 false, true로 표현한다.

그리고 json 문법에서는 안에를 큰 따옴표, 즉 " 로 묶는 것이 컨벤셔널한 방법이다. 그래서 위 코드를 아래와 같이 바꿔쓰게 된다면

import json

dic2 = "{'zdfasdf':'zxcvsddg','zxcadsf':'zxcfsd'}"
print(json.loads(dic2))

# 실행 결과
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

이렇게 json decoder 에러를 내뱉는다.


  • KKJ 2021.07.26 14:24

    와 진짜 파이썬엔 없는게 없네요...

    은유  2021.08.03 22:14 신고

    답변 감사합니다! 다른 언어로도 충분히 가능하지만 파이썬이 좀더 parsing하기 비교적 간단한 것 같습니다