Python3에서 '이진 문자열'을 일반 문자열로 변환하는 방법은 무엇입니까?


258

예를 들어 다음과 같은 문자열이 있습니다 (return value of subprocess.check_output) :

>>> b'a string'
b'a string'

내가 한 일에 관계없이 항상 b'문자열 앞에 성가신 것으로 인쇄됩니다 .

>>> print(b'a string')
b'a string'
>>> print(str(b'a string'))
b'a string'

누구나 일반 문자열로 사용하거나 일반 문자열로 변환하는 방법에 대한 아이디어가 있습니까?



@HanfeiSun " 2 진 문자열 "이라고하는 것은 바이트 객체입니다 ( 표준 라이브러리의 bytes 객체대한 정보 참조 )
loved.by.Jesus

답변:


357

그것을 해독하십시오.

>>> b'a string'.decode('ascii')
'a string'

문자열에서 바이트를 얻으려면 인코딩하십시오.

>>> 'a string'.encode('ascii')
b'a string'

27
@lyomi, ascii주어진 문자열이 ASCII 문자로 만들어 졌기 때문에 사용했습니다 . 당신은 인코딩이 경우 인코딩 지정할 필요가 없습니다 utf-8(에 따라 파이썬 3.x를 기본적 str.encode, bytes.decode문서 현)
falsetru

2
@lyomi 2016 년 (그리고 거의 끝날 때) 사람들은 여전히 ​​아스키를 사용합니다. 많은 '레거시'제품 및 시스템 (사양 포함)이 많이 있지만 유니 코드 또는 여러 바이트를 '합병'하지 않으려는 '이진 문자열'을 생성하는 데는 여러 가지 이유가 있습니다. 단일 문자. 우리는 종종 DNS 요청 등을위한 이진 데이터를 포함하기 위해 '문자열'을 사용합니다.
Jmons

답을 완성하려면 다음을 추가하는 것이 좋습니다. 대부분의 경우 콘솔 출력과 같이 운영 체제에서 바이트를 디코딩해야합니다. 내가 찾은 가장 파이썬적인 방법은 import locale다음과 같습니다 os_encoding = locale.getpreferredencoding(). 이렇게하면my_b_string.decode(os_encoding)
aturegano

2
@aturegano, 유일한 옵션은 아닙니다. sys.getfilesystemencoding(), sys.stdin.encoding, sys.stdout.encoding. IMHO, 자동 인코딩 감지를 사용하면 서브 프로그램 (OP는 서브 프로세스를 사용하고 있음)을 인코딩 (또는 하드 코딩 된)을 결정하는 다른 방법으로 작성할 수 있기 때문에 문제를 해결할 수 있습니다. 어쨌든 의견을 보내 주셔서 감사합니다.
falsetru

@falsetru sys.getfilesystemencoding()유니 코드 파일 이름과 바이트 파일 이름 사이를 변환하는 데 사용되는 인코딩 이름 을 반환하며 사용중인 운영 체제에 따라 크게 달라집니다. AFAIK,이 기능은 시스템의 기본 표현으로 변환하는 데 사용됩니다. 이는 앞에서 언급 한 locale.getpreferredencoding()기능을 사용하여 얻을 수있는 콘솔에서 사용되는 목록 화를 유추하지 않음을 의미합니다.
aturegano

71

falsetru 의 답변이 효과 가 없다면 다음 을 시도해보십시오.

>>> b'a string'.decode('utf-8')
'a string'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.