Python 3.x hace una clara distinción entre los tipos:
str
= '...'
literales = una secuencia de caracteres Unicode (UTF-16 o UTF-32, dependiendo de cómo se compiló Python)
bytes
= b'...'
literales = una secuencia de octetos (números enteros entre 0 y 255)
Si está familiarizado con Java o C#, piensan en str
como String
y bytes
como byte[]
. Si está familiarizado con SQL, piense en str
como NVARCHAR
y bytes
como BINARY
o BLOB
. Si está familiarizado con el registro de Windows, piense en str
como REG_SZ
y bytes
como REG_BINARY
. Si está familiarizado con C (++), entonces olvide todo lo que ha aprendido sobre char
y cadenas, porque UN CARÁCTER NO ES BYTE. Esa idea es obsoleta por mucho tiempo.
Utiliza str
cuando quiere representar texto.
print('שלום עולם')
Se utilizan bytes
cuando se quiere representar datos binarios de bajo nivel como estructuras.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Puede encode un str
a un objeto bytes
.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
Y se puede decodificar un bytes
en un str
.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Pero no puede mezclar libremente los dos tipos.
>>> 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
La notación b'...'
es algo confuso ya que permite que los bytes 0x01-0x7F a ser especificado con caracteres ASCII en lugar de números hexadecimales.
>>> b'A' == b'\x41'
True
Pero debo destacar, un personaje no es un byte.
>>> 'A' == b'A'
False
En Python 2.x
Pre-3.0 versiones de Python carecían de este tipo de distinción entre el texto y datos binarios.En cambio, hubo:
unicode
= u'...'
literales = secuencia de caracteres Unicode = 3.x str
str
= '...'
literales = secuencias de bytes enmascarados/caracteres
- Por lo general, texto, codificado en algunos codificación no especificada.
- Pero también se usa para representar datos binarios como
struct.pack
de salida.
Con el fin de facilitar la transición 2.x con 3.x, la sintaxis literal b'...'
fue portado a Python 2.6, a fin de permitir distinguir cadenas binarias (que debe ser bytes
en 3. x) desde cadenas de texto (que debe ser str
en 3.x). El prefijo b
no hace nada en 2.x, pero le dice al script 2to3
que no lo convierta en una cadena Unicode en 3.x.
Así que sí, b'...'
literales en Python tienen el mismo propósito que lo hacen en PHP.
Además, sólo por curiosidad, ¿hay símbolos más que el B y T que hacen otras cosas ?
El r
prefijo crea una cadena de texto (por ejemplo, r'\t'
es una barra invertida + t
en lugar de una pestaña) y triples comillas '''...'''
o """..."""
permiten literales de cadena multilínea.
Parece que Python
@Gweebz - si realmente está escribiendo una cadena en una codificación particular en lugar de con escapes unicode (por ejemplo, b '\ xff \ xfe \ xe12' en lugar de '\ u32e1'). – detly
Eso tiene sentido. Voy a marcar este como la respuesta aceptada, pero también hay otras buenas respuestas aquí. –