Python 3 바이트 문자열 변수를 일반 문자열로 어떻게 변환합니까?


116

XML 이메일 첨부 파일을 읽었습니다.

bytes_string=part.get_payload(decode=False)

내 변수 이름에서 알 수 있듯이 페이로드는 바이트 문자열로 제공됩니다.

이 문자열을 내가 조작 할 수있는 사용 가능한 문자열로 바꾸기 위해 권장되는 Python 3 접근 방식을 사용하려고합니다.

예제는 다음을 보여줍니다.

str(b'abc','utf-8')

b내 변수에 (bytes) 키워드 인수를 적용 bytes_string하고 권장 방법을 사용하려면 어떻게해야합니까?

내가 시도한 방식이 작동하지 않습니다.

str(bbytes_string, 'utf-8')

답변:


210

마지막 줄에서 거의 옳았습니다. 원하는

str(bytes_string, 'utf-8')

유형 때문에 bytes_stringIS bytes의 종류와 동일 b'abc'.


6
str(bytes_string, 'utf-8', 'ignore')세 번째 매개 변수를 전달하여 오류를 무시할 수 있습니다.
Shubhamoy

2
pylang의 답변에 대한 주석이어야합니다 (잘못된 입력 처리를 다룹니다). (당신이 믿는다면).에 잘못된 bytes_string것이 없다면 왜 오류를 무시하고 싶습니까?
토비 Speight

3
귀하의 접근 방식에서 다음과 같은 오류가 발생 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byte합니다. 다음 바이트 문자열 b'\xbf\x8cd\xba\x7f\xe0\xf0\xb8t\xfe.TaFJ\xad\x100\x07p\xa0\x1f90\xb7P\x8eP\x90\x06)0'@TobySpeight
alper

@alper는 유효한 UTF-8 문자열이 아니므로 무엇을 기대 했습니까?
Toby Speight 2019

해결해 주셔서 감사합니다
Ajay Kumar

49

인스턴스를 호출 decode()하여 bytes인코딩하는 텍스트를 가져옵니다.

str = bytes.decode()

5
UnicodeDecodeError : 'utf-8'코덱이 위치 230에서 0xf6 바이트를 디코딩 할 수 없음 : 유효하지 않은 시작 바이트
Juha Untinen

3
@JuhaUntinen 인코딩은 아마도 utf-8이 아닙니다.
tommy.carstensen

4
배열에서 UTF8이 아닌 문자를 필터링 (건너 뛰기)하는 방법은 무엇입니까?
Dr. Failov

9

업데이트 :

b처음과 끝 부분에 따옴표를 붙이지 마십시오.

bytes이상한 상황에서도 문자열 로 변환하는 방법 .

코드에 인식 할 수 없는'utf-8' 인코딩 문자 가있을 있으므로 추가 매개 변수없이 str 만 사용하는 것이 좋습니다.

some_bad_bytes = b'\x02-\xdfI#)'
text = str( some_bad_bytes )[2:-1]

print(text)
Output: \x02-\xdfI

'utf-8'이 특정 바이트 에 매개 변수 를 추가 하면 오류가 발생합니다.

PYTHON 3 표준이 말했듯 text이 이제는 걱정하지 않고 utf-8에 있습니다.


아마도 그가 원하는 바가 아니다 - 결과는 " '\\ xdfI #) \\ X02'B"입니다
글렌 톰슨

@GlenThompson은 원치 않는 조건에 대한 예일뿐입니다. 이 특정 텍스트를 의도적으로 사용합니다. 텍스트 b에 첫 번째 가 있음을 의미하는 경우 답변을 업데이트했습니다
Seyfi

그래서 정말 감사합니다 나는 문자를 인코딩하고 손실하지 않고 ansi 문자가있는 문자열의 b ''를 제거하는 방법을 찾고 있습니다. 나는 파이썬에서 처음이며 처음부터 배열을 줄일 수 있는지 모르겠습니다. 인덱스를 사용하여 시작 : O
디에고 페르난도 무리 요 Valenci

@DiegoFernandoMurilloValenci, 환영합니다. 도와 드릴 수있어서 기쁩니다.
Seyfi

6

배열에서 UTF8이 아닌 문자를 필터링 (건너 뛰기)하는 방법은 무엇입니까?

@ uname01의 게시물과 OP에서이 댓글을 해결하려면 오류를 무시하세요.

암호

>>> b'\x80abc'.decode("utf-8", errors="ignore")
'abc'

세부

로부터 문서 , 여기에 같은 사용하여 더 많은 예 errors매개 변수 :

>>> b'\x80abc'.decode("utf-8", "replace")
'\ufffdabc'
>>> b'\x80abc'.decode("utf-8", "backslashreplace")
'\\x80abc'
>>> b'\x80abc'.decode("utf-8", "strict")  
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:
  invalid start byte

errors 인수는 인코딩 규칙에 따라 입력 문자열을 변환 할 수없는 경우 응답을 지정합니다. 이 인수의 유효한 값은 'strict'( UnicodeDecodeError예외 발생), 'replace'(사용 U+FFFD, REPLACEMENT CHARACTER) 또는 'ignore'(유니 코드 결과에서 문자를 제외)입니다.

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