Python 3에서 문자열을 바이트로 변환하는 가장 좋은 방법?
TypeError에 대한 답변에서 볼 수 있듯이 문자열을 바이트로 변환하는 두 가지 다른 방법이 있는 것 같다: 'str'는 버퍼 인터페이스를 지원하지 않는다.
이 방법들 중 어느 것이 더 좋을까, 아니면 더 피토닉적인가?아니면 개인적인 취향의 문제일까?
b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')
를 .bytes
, 그것은 당신에게 다음을 가리킨다.
bytearray([소스[, 인코딩[, 오류]])
새 바이트 배열을 반환하십시오.byterray type은 0 <= x < 256 범위의 정수의 변이 가능한 시퀀스다.바이트 유형에는 바이트 유형과 바이트 유형에서 설명하는 대부분의 일반적인 돌연변이 시퀀스 방법이 있으며 바이트 및 바이트 배열 방법을 참조하십시오.
선택적 소스 매개 변수를 사용하여 다음과 같은 몇 가지 방법으로 어레이를 초기화할 수 있다.
문자열인 경우 인코딩(및 선택적으로 오류) 매개 변수도 제공해야 한다. bytearray()는 str.encode()를 사용하여 문자열을 바이트로 변환하십시오.
정수일 경우 배열은 해당 크기를 가지며 null 바이트로 초기화된다.
버퍼 인터페이스에 적합한 객체인 경우, 객체의 읽기 전용 버퍼가 바이트 배열을 초기화하는데 사용된다.
반복 가능한 경우 배열의 초기 내용물로 사용되는 0 <= x < 256의 범위 내의 수많은 정수여야 한다.
인수가 없으면 크기 0의 배열이 생성된다.
그렇게bytes
단순히 끈을 인코딩하는 것 이상의 것을 할 수 있다.피토닉은 어떤 종류의 소스 파라미터를 가지고도 생성자를 호출할 수 있게 해준다.
문자열을 인코딩하는 경우some_string.encode(encoding)
「이 줄을 이으로 인코딩한다가 자자하다보다 하다. 왜냐하면 그것은 가장 자체적인 문서화이기 때문이다. "이 문자열을 가져다가 이 인코딩으로 인코딩"은 보다 더 명확하다.bytes(some_string, encoding)
-- 생성자를 사용할 때는 명시적인 동사가 없다.
파이톤 소스를 확인했어유니코드 문자열을 다음으로 전달하는 경우bytes
CPython을 사용하여, PyUnicode_AsEncodedString이라고 부르는데, 이 String의 실행이다.encode
; 그래서 전화를 걸면 그냥 한 단계의 우회적인 단계를 건너뛰는 겁니다.encode
네 자신.
또한, 세르달리스의 코멘트를 보십시오.unicode_string.encode(encoding)
또한 그것의 역행은 더 피톤닉하다.byte_string.decode(encoding)
그리고 대칭이 좋다.
생각보다 쉽네
my_str = "hello world"
my_str_as_bytes = str.encode(my_str)
type(my_str_as_bytes) # ensure it is byte representation
my_decoded_str = my_str_as_bytes.decode()
type(my_decoded_str) # ensure it is string representation
절대적으로 가장 좋은 방법은 둘 중 하나가 아니라 세 번째다.기본값으로 설정할 첫 번째 매개 변수 'utf-8'
파이톤 3.0 이후로 계속.그러므로 가장 좋은 방법은
b = mystring.encode()
또한 기본 인수가 문자열을 생성하지 않으므로 이 인수는 더 빠를 것이다."utf-8"
C 코드에서, 그러나, 어느 것이 훨씬 더 빠른지 확인해봐라!
몇 가지 타이밍이 있다.
In [1]: %timeit -r 10 'abc'.encode('utf-8')
The slowest run took 38.07 times longer than the fastest.
This could mean that an intermediate result is being cached.
10000000 loops, best of 10: 183 ns per loop
In [2]: %timeit -r 10 'abc'.encode()
The slowest run took 27.34 times longer than the fastest.
This could mean that an intermediate result is being cached.
10000000 loops, best of 10: 137 ns per loop
경고에도 불구하고, 반복된 주행 후에 시간은 매우 안정적이었다 - 편차는 2%에 불과했다.
사용.encode()
인수가 없으면 Python 2와 호환되지 않으며, 기본 문자 인코딩은 ASCII이다.문자 인코딩은 ASCII이다.
>>> 'äöä'.encode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
약간 다른 문제에 대한 답변:
str 변수에 저장된 일련의 원시 유니코드를 가지고 있는 경우:
s_str: str = "\x00\x01\x00\xc0\x01\x00\x00\x00\x04"
유니코드의 바이트 리터럴을 얻을 수 있어야 한다(cructure.unpack()용) 등)
s_bytes: bytes = b'\x00\x01\x00\xc0\x01\x00\x00\x00\x04'
해결책:
s_new: bytes = bytes(s, encoding="raw_unicode_escape")
참조(표준 인코딩의 경우 위로 스크롤):
참조URL: https://stackoverflow.com/questions/7585435/best-way-to-convert-string-to-bytes-in-python-3
'programing' 카테고리의 다른 글
브라우저가 최소화된 경우 직렬 포트의 데이터 전송 (0) | 2022.03.31 |
---|---|
파이톤 3의 로_input()과 인풋()의 차이점은 무엇일까. (0) | 2022.03.31 |
렌더에서 다시 호출 기능을 중지하는 방법 (0) | 2022.03.31 |
[부유 경고]:요소를 찾을 수 없음 (0) | 2022.03.31 |
상태로 전달된 더 많은 데이터, 올바르게 수행되지 않음 (0) | 2022.03.31 |