'b'문자는 문자열 리터럴 앞에서 무엇을합니까?
분명히 다음은 유효한 구문입니다.
my_string = b'The string'
나는 알고 싶습니다:
b
문자열 앞 의이 문자는 무엇을 의미합니까?- 그것을 사용하면 어떤 효과가 있습니까?
- 그것을 사용하기에 적절한 상황은 무엇입니까?
나는 바로 여기에서 관련 질문을 찾았 지만 그 질문은 PHP에 관한 b
것이며, 코드가 PHP <6 버전과 호환되는 데 필요한 유니 코드와 달리 문자열이 바이너리임을 나타내는 데 사용된다는 것을 나타냅니다. , PHP 6으로 마이그레이션 할 때 이것이 Python에 적용되지 않는다고 생각합니다.
동일한 구문 의 문자를 사용하여 문자열을 유니 코드로 지정하는 것에 대한 Python 사이트 에서이 문서 를 찾았습니다 u
. 불행히도 해당 문서의 어느 곳에서도 b 문자를 언급하지 않습니다 .
또한, 단지 호기심의보다 더 많은 문자가 있습니다 b
및 u
다른 일을?
Python 2.x 문서 를 인용하려면 :
'b'또는 'B'접두사는 Python 2에서 무시됩니다. 이는 리터럴이 Python 3에서 바이트 리터럴이되어야 함을 나타냅니다 (예 : 코드가 2to3로 자동 변환되는 경우). 'u'또는 'b'접두사 뒤에는 'r'접두사가 올 수 있습니다.
파이썬 3 문서 상태 :
바이트 리터럴은 항상 'b'또는 'B'로 시작됩니다. str 유형 대신 바이트 유형의 인스턴스를 생성합니다. ASCII 문자 만 포함 할 수 있습니다. 숫자 값이 128 이상인 바이트는 이스케이프로 표현해야합니다.
Python 3.x 는 유형을 명확하게 구분합니다.
str
='...'
리터럴 = 유니 코드 문자 시퀀스 (Python 컴파일 방법에 따라 UTF-16 또는 UTF-32)bytes
=b'...'
리터럴 = 옥텟 시퀀스 (0에서 255 사이의 정수)
자바 나 C #을 나왔습니다에 익숙한 당신이 경우, 생각 str
등 String
과 bytes
같은 byte[]
. 당신은 SQL에 익숙하다면, 생각 str
등 NVARCHAR
과 bytes
같은 BINARY
나 BLOB
. 당신이 Windows 레지스트리에 익숙하다면, 생각 str
등 REG_SZ
과 bytes
같은 REG_BINARY
. C (++)에 익숙하다면 A CHARACTER는 BYTE가char
아니기 때문에 배운 모든 것과 문자열 을 잊어 버리십시오 . 그 아이디어는 오랫동안 쓸모가 없습니다.
str
텍스트를 표현하고 싶을 때 사용 합니다.
print('שלום עולם')
당신은 사용 bytes
이 구조체와 같은 낮은 수준의 바이너리 데이터를 표현하고자 할 때.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
당신은 할 수 인코딩 을 str
A와 bytes
객체입니다.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
그리고 당신은을 디코딩 할 수 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'...'
표기는 어느 정도는 ASCII 문자 대신 진수 번호를 지정할 수 0x01-0x7F 바이트 수 있다는 점에서 혼동된다.
>>> b'A' == b'\x41'
True
그러나 강조해야 할 점 은 문자는 바이트가 아닙니다 .
>>> 'A' == b'A'
False
Python 2.x에서
3.0 이전 버전의 Python에는 텍스트와 이진 데이터 사이에 이런 종류의 구분이 없습니다. 대신 다음이있었습니다.
unicode
=u'...'
리터럴 = 유니 코드 문자 시퀀스 = 3.xstr
str
='...'
리터럴 = 혼란스러운 바이트 / 문자 시퀀스- 일반적으로 일부 지정되지 않은 인코딩으로 인코딩 된 텍스트입니다.
- 그러나
struct.pack
출력 과 같은 이진 데이터를 나타내는데도 사용됩니다 .
In order to ease the 2.x-to-3.x transition, the b'...'
literal syntax was backported to Python 2.6, in order to allow distinguishing binary strings (which should be bytes
in 3.x) from text strings (which should be str
in 3.x). The b
prefix does nothing in 2.x, but tells the 2to3
script not to convert it to a Unicode string in 3.x.
So yes, b'...'
literals in Python have the same purpose that they do in PHP.
Also, just out of curiosity, are there more symbols than the b and u that do other things?
The r
prefix creates a raw string (e.g., r'\t'
is a backslash + t
instead of a tab), and triple quotes '''...'''
or """..."""
allow multi-line string literals.
The b denotes a byte string.
Bytes are the actual data. Strings are an abstraction.
If you had multi-character string object and you took a single character, it would be a string, and it might be more than 1 byte in size depending on encoding.
If took 1 byte with a byte string, you'd get a single 8-bit value from 0-255 and it might not represent a complete character if those characters due to encoding were > 1 byte.
TBH I'd use strings unless I had some specific low level reason to use bytes.
From server side, if we send any response, it will be sent in the form of byte type, so it will appear in the client as b'Response from server'
In order get rid of b'....'
simply use below code:
Server file:
stri="Response from server"
c.send(stri.encode())
Client file:
print(s.recv(1024).decode())
then it will print Response from server
It turns it into a bytes
literal (or str
in 2.x), and is valid for 2.6+.
The r
prefix causes backslashes to be "uninterpreted" (not ignored, and the difference does matter).
Here's an example where the absence of b
would throw a TypeError
exception in Python 3.x
>>> 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
Adding a b
prefix would fix the problem.
In addition to what others have said, note that a single character in unicode can consist of multiple bytes.
The way unicode works is that it took the old ASCII format (7-bit code that looks like 0xxx xxxx) and added multi-bytes sequences where all bytes start with 1 (1xxx xxxx) to represent characters beyond ASCII so that Unicode would be backwards-compatible with 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
You can use JSON to convert it to dictionary
import json
data = b'{"key":"value"}'
print(json.loads(data))
{"key":"value"}
FLASK:
This is an example from flask. Run this on terminal line:
import requests
requests.post(url='http://localhost(example)/',json={'key':'value'})
In flask/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)
{'key':'value'}
'program story' 카테고리의 다른 글
AngularJS 템플릿의 if else 문 (0) | 2020.09.30 |
---|---|
Swift 언어의 #ifdef 대체 (0) | 2020.09.30 |
파이썬에서 16 진수 문자열을 int로 변환 (0) | 2020.09.30 |
jQuery를 사용하여 키보드에서 Enter 키를 감지하는 방법은 무엇입니까? (0) | 2020.09.30 |
Git 저장소를 특정 커밋으로 롤백 (재설정)하는 방법은 무엇입니까? (0) | 2020.09.30 |