'b'문자는 문자열 리터럴 앞에서 무엇을합니까?


831

다음은 유효한 구문입니다.

my_string = b'The string'

나는 알고 싶다:

  1. b줄 앞 의이 문자는 무엇을 의미합니까?
  2. 그것을 사용하면 어떤 효과가 있습니까?
  3. 그것을 사용하기에 적절한 상황은 무엇입니까?

여기에서 관련 질문을 찾았 지만 PHP에 관한 질문이며 bPHP <6 버전과 호환되는 코드에 필요한 유니 코드와 달리 문자열이 바이너리임을 나타내는 데 사용됩니다 PHP 6으로 마이그레이션 할 때 이것이 파이썬에 적용되지 않는다고 생각합니다.

파이썬 사이트 에서 동일한 구문 의 문자를 사용하여 문자열을 유니 코드로 지정하는 방법에 대한 이 설명서 를 찾았습니다 u. 불행히도, 이 문서의 어느 곳에서나 b 문자 는 언급하지 않습니다 .

또한, 단지 호기심의보다 더 많은 문자가 있습니다 bu다른 일을?

답변:


416

Python 2.x 설명서 를 인용하려면 :

파이썬 2에서는 접두사 'b'또는 'B'가 무시됩니다. 이는 리터럴이 파이썬 3에서 바이트 리터럴이되어야 함을 나타냅니다 (예 : 코드가 2to3으로 자동 변환 될 때). 'u'또는 'b'접두어 뒤에 'r'접 두부가 올 수 있습니다.

파이썬 3 문서 상태 :

바이트 리터럴은 항상 'b'또는 'B'로 시작합니다. str 유형 대신 bytes 유형의 인스턴스를 생성합니다. ASCII 문자 만 포함 할 수 있습니다. 128 이상의 숫자 값을 가진 바이트는 이스케이프로 표현해야합니다.


4
따라서 파이썬 <v3 은이 추가 문자를 무시하는 것처럼 들립니다. v3에서 일반 문자열이 아닌 ab 문자열을 사용해야하는 경우는 무엇입니까?
Jesse Webb 2016 년

5
@Gweebz-실제로 유니 코드 이스케이프 대신 특정 인코딩으로 문자열을 입력하는 경우 (예 : '\ u32e1'대신 b '\ xff \ xfe \ xe12')
detly

7
실제로, unicode_literals에서 가져온 경우 __future__,이 특정 문자열 (Python 2.x)의 동작을 "반전"합니다.
Romuald Brunet

34
인용 된 문서를 둘러싼 좀 더 평범한 언어 이야기는 이것이 더 나은 해답이 될 것입니다
IM-R

2
그렇지 않으면 이미 그것을 이해하는 사람에게 답이됩니다.
Rafael Eyng

678

파이썬 3.x 는 타입을 명확하게 구분합니다 :

  • str= '...'리터럴 = 일련의 유니 코드 문자 (UTF-16 또는 UTF-32, Python 컴파일 방식에 따라 다름)
  • bytes= b'...'리터럴 = 일련의 8 진수 (0에서 255 사이의 정수)

자바 나 C #을 나왔습니다에 익숙한 당신이 경우, 생각 strStringbytes같은 byte[]. 당신은 SQL에 익숙하다면, 생각 strNVARCHARbytes같은 BINARYBLOB. 당신이 Windows 레지스트리에 익숙하다면, 생각 strREG_SZbytes같은 REG_BINARY. C (++)에 익숙하다면 char, CHARACTER는 BYTE가 아니기 때문에 배운 모든 것과 문자열 을 잊어 버리십시오 . 그 아이디어는 오래 쓸모가 없습니다.

str텍스트를 나타내려고 할 때 사용 합니다.

print('שלום עולם')

bytes구조체와 같은 하위 수준 이진 데이터를 나타내려고 할 때 사용 합니다.

NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]

a 를 객체로 인코딩 할 수 있습니다 .strbytes

>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'

그리고를 a bytes로 디코딩 할 수 있습니다 str.

>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'

그러나 두 가지 유형을 자유롭게 혼합 할 수는 없습니다.

>>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str

b'...'표기법은 바이트 0x01-0x7F를 16 진수 대신 ASCII 문자로 지정할 수 있다는 점에서 다소 혼란 스럽습니다.

>>> b'A' == b'\x41'
True

그러나 나는 문자가 바이트가 아니라는 것을 강조해야합니다 .

>>> 'A' == b'A'
False

Python 2.x에서

3.0 이전 버전의 Python에서는 텍스트와 이진 데이터 간의 구분이 부족했습니다. 대신에

  • unicode= u'...'리터럴 = 유니 코드 문자 시퀀스 = 3.xstr
  • str= '...'리터럴 = 혼란스러운 바이트 / 문자 시퀀스
    • 일반적으로 일부 지정되지 않은 인코딩으로 인코딩 된 텍스트입니다.
    • 그러나 struct.pack출력 과 같은 이진 데이터를 나타내는 데에도 사용됩니다 .

2.x에서 -3.x 로의 전환을 용이하게하기 위해 b'...'리터럴 구문은 이진 문자열 ( bytes3.x에 있어야 함 )과 텍스트 문자열 ( str3에 있어야 함)을 구별 할 수 있도록 Python 2.6으로 백 포트되었습니다. .엑스). b접두사는 2.X에서 아무것도하지 않는다,하지만 알 2to33.x에서의 유니 코드 문자열로 변환하지 스크립트를

예, b'...'파이썬의 리터럴은 PHP에서와 같은 목적을 가지고 있습니다.

또한 호기심에서 다른 일을하는 b와 u보다 더 많은 상징이 있습니까?

r접두사 (예, 원시 문자열을 생성 r'\t'백 슬래시 +입니다 t대신 탭), 트리플 따옴표 '''...'''또는 """..."""여러 줄 문자열 리터럴을 할 수 있습니다.


2
감사! "2.x에서 3.x 로의 전환을 용이하게하기 위해 b '...'리터럴 구문은 이진 문자열을 구별하기 위해 파이썬 2.6으로 백 포트되었습니다. 텍스트 문자열 (3.x의 str이어야 함)에서 2.x의 바이트 여야합니다. b 접두사는 2.x에서는 아무 것도 수행하지 않지만 2to3 스크립트는이를 3.x의 유니 코드 문자열로 변환하지 않습니다. "
tommy.carstensen

4
'A' == b'A' --> False검사는 정말 이 취소합니다. 나머지는 훌륭하지만 그 시점까지는 바이트 문자열이 실제로 텍스트
와일드 카드

12
'שלום עולם' == 'hello world'
Eli

12
이것은 단지 문서를 인용하는 수용 된 대답보다 훨씬 분명합니다. 나에게 문서가 이해가되지 않아서 문서의 추가 컨텍스트를 제공하는 것이 좋습니다. 감사!
rayryeng

2
B "일부 문자열".decode ( 'UTF-8'), 나는 그 많은 사람들이 찾고있는 줄 믿습니다
마빈 Thobejane

22

b는 바이트 문자열을 나타냅니다.

바이트는 실제 데이터입니다. 문자열은 추상화입니다.

다중 문자 문자열 객체가 있고 단일 문자를 사용하는 경우 문자열이되며 인코딩에 따라 크기가 1 바이트를 초과 할 수 있습니다.

바이트 문자열과 함께 1 바이트를 사용하면 0-255에서 단일 8 비트 값을 얻을 수 있으며 인코딩으로 인해 해당 문자가 1 바이트보다 크면 완전한 문자를 나타내지 않을 수 있습니다.

TBH 바이트를 사용해야하는 특정 저수준 이유가 없으면 문자열을 사용합니다.


16

서버 측에서 응답을 보내면 바이트 유형의 형태로 전송되므로 클라이언트에 다음과 같이 나타납니다. b'Response from server'

b'....'아래 코드를 사용 하여 간단히 제거하십시오 .

서버 파일 :

stri="Response from server"    
c.send(stri.encode())

클라이언트 파일 :

print(s.recv(1024).decode())

그런 다음 인쇄됩니다 Response from server


1
Jesse Webb이 요청한 질문에 대해서는 설명하지 않습니다!
찬드라 칸트

인코딩 및 디코딩 방법을 사용하지 않으면 파이썬이 문자열 유형 대신 바이트 유형으로 가져 가면 문자열 출력에 b ''접두사가 붙습니다 .b '와 같은 출력을 원하지 않으면 ... '위의 내용을 사용하십시오.
Nani Chintha

실제로 이것은 질문 의 제목 에 대한 정답입니다. Q : "b'x '는 무엇을합니까?" A : " 'x'.encode () 않습니다." 질문의 나머지 부분은 이것보다 훨씬 더 많은 것을 알고 싶었지만 제목이 대답되었습니다.
마이클 에릭슨

10

다음 은 Python 3.x에서 예외 bTypeError발생 하지 않는 예입니다.

>>> f=open("new", "wb")
>>> f.write("Hello Python!")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' does not support the buffer interface

b접두사를 추가 하면 문제가 해결됩니다.


9

그것은로 변 bytes문자 (또는 str2.X에서) 및 2.6+ 유효하다.

r접두사는 백 슬래시는 "해석되지"되도록 (무시하지, 그 차이는 않습니다 문제).


이것은 aix의 답변에 인용 된 문서에 따라 잘못 들립니다. b는 3이 아닌 파이썬 버전에서는 무시 될 것이다.
Jesse Webb

2
그것은 str2.x에서 어느 쪽이든 될 것이기 때문에 무시된다고 말할 수 있습니다. 차이점 unicode_literals__future__모듈 에서 가져올 때 중요 합니다.
Ignacio Vazquez-Abrams

6

다른 사람들이 말한 것 외에도 유니 코드의 단일 문자 는 여러 바이트로 구성 될 수 있습니다 .

유니 코드가 작동하는 방식은 이전 ASCII 형식 (0xxx xxxx처럼 보이는 7 비트 코드)을 취하고 모든 바이트가 1 (1xxx xxxx)로 시작하여 ASCII 이외의 문자를 나타내므로 유니 코드가 거꾸로 되도록 멀티 바이트 시퀀스를 추가 하는 것입니다 ASCII와 호환 됩니다.

>>> len('Öl')  # German word for 'oil' with 2 characters
2
>>> 'Öl'.encode('UTF-8')  # convert str to bytes 
b'\xc3\x96l'
>>> len('Öl'.encode('UTF-8'))  # 3 bytes encode 2 characters !
3

2

JSON을 사용하여 사전으로 변환 할 수 있습니다.

import json
data = b'{"key":"value"}'
print(json.loads(data))

{"핵심 가치"}


플라스크:

이것은 플라스크의 예입니다. 터미널 라인에서 이것을 실행하십시오 :

import requests
requests.post(url='http://localhost(example)/',json={'key':'value'})

플라스크 /routes.py에서

@app.route('/', methods=['POST'])
def api_script_add():
    print(request.data) # --> b'{"hi":"Hello"}'
    print(json.loads(request.data))
return json.loads(request.data)

{'핵심 가치'}

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