Python 3에서 문자열을 바이트로 변환하는 가장 좋은 방법은 무엇입니까?
TypeError 에 대한 답변에서 볼 수 있듯이 문자열을 바이트로 변환하는 방법에는 두 가지가 있습니다 . 'str'은 버퍼 인터페이스를 지원하지 않습니다.
이 방법 중 어느 것이 더 좋거나 더 Pythonic입니까? 아니면 개인적인 취향의 문제입니까?
b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')
에 대한 문서를 보면 다음을 bytes
가리 킵니다 bytearray
.
bytearray ([소스 [, 인코딩 [, 오류]]])
새로운 바이트 배열을 반환합니다. bytearray 유형은 0 <= x <256 범위의 정수의 가변 시퀀스입니다. 가변 시퀀스 유형에 설명 된 대부분의 일반적인 가변 시퀀스 메서드와 바이트 유형에있는 대부분의 메서드가 있습니다. Bytes 및 바이트 배열 방법.
선택적 source 매개 변수를 사용하여 몇 가지 다른 방법으로 배열을 초기화 할 수 있습니다.
문자열 인 경우 인코딩 (및 선택적으로 오류) 매개 변수도 제공해야합니다. bytearray ()는 str.encode ()를 사용하여 문자열을 바이트로 변환합니다.
정수인 경우 배열은 해당 크기를 가지며 널 바이트로 초기화됩니다.
버퍼 인터페이스를 따르는 객체 인 경우 객체의 읽기 전용 버퍼를 사용하여 바이트 배열을 초기화합니다.
반복 가능한 경우 배열의 초기 내용으로 사용되는 0 <= x <256 범위의 정수 반복 가능이어야합니다.
인수가 없으면 크기 0의 배열이 생성됩니다.
따라서 bytes
문자열을 인코딩하는 것 이상을 수행 할 수 있습니다. 의미있는 모든 유형의 소스 매개 변수로 생성자를 호출 할 수 있다는 것은 Pythonic입니다.
문자열을 인코딩 할 some_string.encode(encoding)
때는 생성자를 사용하는 것보다 파이썬 적이라고 생각합니다 . 왜냐하면 가장 자체 문서화이기 때문입니다. "이 문자열을 가져와이 인코딩으로 인코딩"이 더 명확합니다 bytes(some_string, encoding)
.-다음을 사용할 때 명시적인 동사가 없습니다. 건설자.
편집 : Python 소스를 확인했습니다. bytes
CPython 을 사용하여 유니 코드 문자열을 전달하면 ; 의 구현 인 PyUnicode_AsEncodedString 을 호출합니다 encode
. 그래서 당신은 encode
자신 을 부르면 간접적 인 수준을 건너 뛰는 것입니다.
또한 Serdalis의 주석을 참조하십시오- unicode_string.encode(encoding)
역이 byte_string.decode(encoding)
있고 대칭이 좋기 때문에 더 Pythonic 입니다.
생각보다 쉽습니다.
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
절대적으로 가장 좋은 방법은 어느 쪽도 2의 없지만, 3. 첫 번째 매개 변수는 Python 3.0 이후 기본값 입니다. 따라서 가장 좋은 방법은encode
'utf-8'
b = mystring.encode()
기본 인수 "utf-8"
가 C 코드 의 문자열 이 아니라 확인 NULL
하는 것이 훨씬 더 빠르기 때문에 이것은 또한 더 빠를 것입니다 !
다음은 몇 가지 타이밍입니다.
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와 호환되지 않습니다. Python 2에서 기본 문자 인코딩은 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)
참고 URL : https://stackoverflow.com/questions/7585435/best-way-to-convert-string-to-bytes-in-python-3
'program story' 카테고리의 다른 글
Bash 스크립트가 자신의 전체 경로를 가져 오는 신뢰할 수있는 방법 (0) | 2020.10.02 |
---|---|
Android 오류 : 기기에 * .apk를 설치하지 못했습니다. * : 시간 초과 (0) | 2020.09.30 |
문자열을 대문자로 변경하는 방법 (0) | 2020.09.30 |
.css ()를 사용하여! important를 적용하는 방법은 무엇입니까? (0) | 2020.09.30 |
Ruby에서 문자열에 하위 문자열이 포함되어 있는지 확인하는 방법은 무엇입니까? (0) | 2020.09.30 |