파이썬에서 바이트 문자열(byte string)은 문자열 앞에 b라는 접두사가 붙어 있는 형태로 표현되는 문자열입니다. 파이썬 3부터 문자열(str)과 바이트(bytes)는 서로 다른 타입으로 구분되기 때문에, 네트워크 통신이나 파일 입출력 과정에서 키와 값이 바이트 문자열로 구성된 딕셔너리를 자주 접하게 됩니다. 이 글에서는 이러한 바이트 문자열 딕셔너리를 일반 문자열만으로 이루어진 딕셔너리로 변환하는 두 가지 방법을 살펴보겠습니다.
decode() 함수와 ascii 인코딩 활용
파이썬의 문자열 메서드인 decode()는 등록된 코덱(codec)을 기준으로 문자열을 디코딩하며, 별도의 인코딩을 지정하지 않으면 기본 문자열 인코딩이 적용됩니다. 여기서는 decode 함수에 'ascii'를 매개변수로 전달하여 바이트 문자열 값을 일반 아스키(ASCII) 값으로 변환합니다. 딕셔너리 컴프리헨션(dictionary comprehension)을 활용하면 코드를 간결하게 작성할 수 있습니다.
예제
bstring = {b'day': b'Tue', b'time': b'2 pm', b'subject': b'Graphs'}
print(bstring)
# decode 사용
stringA = {y.decode('ascii'): bstring.get(y).decode('ascii') for y in bstring.keys()}
# 결과 출력
print(stringA)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
{'subject': 'Graphs', 'day': 'Tue', 'time': '2 pm'}
{u'time': u'2 pm', u'day': u'Tue', u'subject': u'Graphs'}decode() 함수와 utf-8 인코딩 활용
앞선 방식과 유사하지만 이번에는 utf-8 인코딩을 사용하는 방법입니다. utf-8은 전 세계 대부분의 문자를 지원하기 때문에 한글 등 비ASCII 문자가 포함된 데이터를 처리할 때 더욱 안전하게 사용할 수 있습니다. for 루프를 통해 딕셔너리의 각 키-값 쌍을 순회하면서 모든 요소를 utf-8 방식으로 변환합니다.
예제
bstring = {b'day': b'Tue', b'time': b'2 pm', b'subject': b'Graphs'}
print(bstring)
# decode 사용
stringA = {}
for key, value in bstring.items():
stringA[key.decode("utf-8")] = value.decode("utf-8")
# 결과 출력
print(stringA)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
{'subject': 'Graphs', 'day': 'Tue', 'time': '2 pm'}
{u'time': u'2 pm', u'day': u'Tue', u'subject': u'Graphs'}정리
바이트 문자열로 구성된 딕셔너리를 일반 문자열 딕셔너리로 변환할 때는 decode() 메서드에 적절한 인코딩(ascii 또는 utf-8)을 지정하면 됩니다. 데이터에 영문자만 포함되어 있다면 ascii 방식으로 충분하지만, 다양한 언어의 문자가 섞여 있을 가능성이 있다면 utf-8을 사용하는 것이 좋습니다. 상황에 맞게 딕셔너리 컴프리헨션과 for 루프 중 편리한 방식을 선택하여 활용해 보시기 바랍니다.