Estoy trabajando con una biblioteca que devuelve una cadena de bytes y necesito convertir esto en una cadena.
Aunque no estoy seguro de cuál es la diferencia, si es que la hay.
Suponiendo Python 3 (en Python 2, esta diferencia está un poco menos definida): una cadena es una secuencia de caracteres, es decir, puntos de código unicode ; Estos son conceptos abstractos y no pueden almacenarse directamente en el disco. Una cadena de bytes es una secuencia de, como era de esperar, bytes, cosas que se pueden almacenar en el disco. El mapeo entre ellos es una codificación : hay muchos de estos (e infinitos son posibles) y necesita saber cuál se aplica en el caso particular para realizar la conversión, ya que una codificación diferente puede mapear los mismos bytes a una cadena diferente:
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-16')
'蓏콯캁澽苏'
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-8')
'τoρνoς'
Una vez que sepa cuál usar, puede usar el .decode()
método de la cadena de bytes para obtener la cadena de caracteres correcta como se indicó anteriormente. Para completar, el .encode()
método de una cadena de caracteres va en sentido contrario:
>>> 'τoρνoς'.encode('utf-8')
b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'
str
tipo es el mismo que elbytes
tipo; esta respuesta es comparar de manera equivalente elunicode
tipo (no existe en Python 3) con elstr
tipo.str
objetos de Python 3 no es accesible o relevante desde el lado de Python; La estructura de datos es solo una secuencia de puntos de código. Bajo PEP 393 , la codificación interna exacta es una de Latin-1, UCS2 o UCS4, y una representación utf-8 puede almacenarse en caché después de que se solicite por primera vez, pero incluso el código C no se recomienda confiar en estos detalles internos.Lo único que una computadora puede almacenar es bytes.
Para almacenar cualquier cosa en una computadora, primero debe codificarla , es decir, convertirla a bytes. Por ejemplo:
MP3
,WAV
, etc.PNG
,JPEG
, etc.ASCII
,UTF-8
, etc.MP3
,WAV
,PNG
,JPEG
,ASCII
YUTF-8
son ejemplos de codificaciones . Una codificación es un formato para representar audio, imágenes, texto, etc. en bytes.En Python, una cadena de bytes es solo eso: una secuencia de bytes. No es legible para los humanos. Debajo del capó, todo debe convertirse a una cadena de bytes antes de que pueda almacenarse en una computadora.
Por otro lado, una cadena de caracteres, a menudo simplemente llamada "cadena", es una secuencia de caracteres. Es legible para los humanos. Una cadena de caracteres no puede almacenarse directamente en una computadora, primero debe codificarse (convertirse en una cadena de bytes). Existen múltiples codificaciones a través de las cuales una cadena de caracteres se puede convertir en una cadena de bytes, como
ASCII
yUTF-8
.El código Python anterior codificará la cadena
'I am a string'
usando la codificaciónASCII
. El resultado del código anterior será una cadena de bytes. Si lo imprime, Python lo representará comob'I am a string'
. Sin embargo, recuerde que las cadenas de bytes no son legibles por humanos , es solo que Python las decodifica desdeASCII
que las imprime. En Python, una cadena de bytes está representada por ab
, seguida de laASCII
representación de la cadena de bytes .Una cadena de bytes se puede decodificar nuevamente en una cadena de caracteres, si conoce la codificación que se utilizó para codificarla.
El código anterior devolverá la cadena original
'I am a string'
.La codificación y la decodificación son operaciones inversas. Todo debe estar codificado antes de poder escribirse en el disco, y debe descodificarse antes de que un humano pueda leerlo.
fuente
Nota: Elaboraré más mi respuesta para Python 3 ya que el final de la vida de Python 2 está muy cerca.
En Python 3
bytes
consiste en secuencias de valores sin signo de 8 bits, mientras questr
consiste en secuencias de puntos de código Unicode que representan caracteres textuales de lenguajes humanos.A pesar de que
bytes
ystr
parece funcionar de la misma manera, sus casos no son compatibles entre sí, es decir,bytes
ystr
los casos no se pueden utilizar junto con operadores como>
y+
. Además, tenga en cuenta que la comparaciónbytes
y lasstr
instancias de igualdad, es decir==
, el uso , siempre se evaluaránFalse
incluso cuando contengan exactamente los mismos caracteres.Otro problema cuando se trata
bytes
ystr
está presente cuando se trabaja con archivos que se devuelven utilizando laopen
función incorporada. Por un lado, si desea leer o escribir datos binarios en / desde un archivo, siempre abra el archivo usando un modo binario como 'rb' o 'wb'. Por otro lado, si desea leer o escribir datos Unicode en / desde un archivo, tenga en cuenta la codificación predeterminada de su computadora, por lo que si es necesario, pase elencoding
parámetro para evitar sorpresas.En Python 2
str
consiste en secuencias de valores de 8 bits, mientras queunicode
consiste en secuencias de caracteres Unicode. Una cosa a tener en cuenta es questr
, yunicode
se puede utilizar junto con los operadores sistr
sólo se compone de caracteres ASCI de 7 bits.Puede ser útil usar funciones de ayuda para convertir entre
str
yunicode
en Python 2, y entrebytes
ystr
en Python 3.fuente
De lo que es Unicode :
Entonces, cuando una computadora representa una cadena, encuentra los caracteres almacenados en la computadora a través de su número Unicode único y estas cifras se almacenan en la memoria. Pero no puede escribir directamente la cadena en el disco o transmitir la cadena en la red a través de su número Unicode único porque estas cifras son simplemente un número decimal simple. Debe codificar la cadena en una cadena de bytes, como
UTF-8
.UTF-8
es una codificación de caracteres capaz de codificar todos los caracteres posibles y almacena caracteres como bytes (parece que este ). Entonces, la cadena codificada se puede usar en todas partes porqueUTF-8
es casi compatible en todas partes. Cuando abres un archivo de texto codificado enUTF-8
desde otros sistemas, su computadora lo decodificará y mostrará caracteres en él a través de su número único Unicode. Cuando un navegador recibe datos de cadena codificadosUTF-8
desde la red, decodificará los datos en cadena (supondrá que el navegador estáUTF-8
codificando) y mostrará la cadena.En python3, puede transformar cadenas y cadenas de bytes entre sí:
En una palabra, la cadena es para mostrar a los humanos para leer en una computadora y la cadena de bytes es para almacenar en el disco y la transmisión de datos.
fuente
Unicode es un formato acordado para la representación binaria de caracteres y varios tipos de formato (por ejemplo, minúsculas / mayúsculas, nueva línea, retorno de carro) y otras "cosas" (por ejemplo, emojis). Una computadora no es menos capaz de almacenar una representación unicode (una serie de bits), ya sea en la memoria o en un archivo, que es capaz de almacenar una representación ASCII (una serie diferente de bits), o cualquier otra representación (serie de bits) )
Para que la comunicación tenga lugar, las partes en la comunicación deben acordar qué representación se utilizará.
Debido a que Unicode busca representar todos los caracteres posibles (y otras "cosas") utilizados en la comunicación entre humanos y entre computadoras, requiere una mayor cantidad de bits para la representación de muchos caracteres (o cosas) que otros sistemas de representación que busca representar un conjunto más limitado de personajes / cosas. Para "simplificar" y quizás para acomodar el uso histórico, la representación unicode se convierte casi exclusivamente en algún otro sistema de representación (por ejemplo, ascii) con el propósito de almacenar caracteres en archivos.
No es el caso que unicode no se pueda usar para almacenar caracteres en archivos o transmitirlos a través de cualquier canal de comunicaciones, simplemente que no es así.
El término "cadena" no está definido con precisión. "Cadena", en su uso común, se refiere a un conjunto de caracteres / cosas. En una computadora, esos caracteres pueden almacenarse en cualquiera de las diferentes representaciones bit a bit. Una "cadena de bytes" es un conjunto de caracteres almacenados utilizando una representación que utiliza ocho bits (ocho bits se denominan bytes). Dado que, en estos días, las computadoras usan el sistema Unicode (caracteres representados por un número variable de bytes) para almacenar caracteres en la memoria y cadenas de bytes (caracteres representados por bytes individuales) para almacenar caracteres en archivos, se debe usar una conversión antes de los caracteres representados en la memoria se moverá al almacenamiento en archivos.
fuente
Tengamos una cadena simple de un carácter
'š'
y codifíquela en una secuencia de bytes:Para el propósito de este ejemplo, visualicemos la secuencia de bytes en su forma binaria:
Ahora generalmente no es posible decodificar la información sin saber cómo se codificó. Solo si sabe que
utf-8
se utilizó la codificación de texto, puede seguir el algoritmo para decodificar utf-8 y adquirir la cadena original:Puede mostrar el número binario
101100001
como una cadena:fuente
Los lenguajes Python incluyen
str
ybytes
como estándar "Tipos incorporados". En otras palabras, son ambas clases. No creo que valga la pena intentar racionalizar por qué Python se ha implementado de esta manera.Dicho esto,
str
ybytes
son muy similares entre sí. Ambos comparten la mayoría de los mismos métodos. Los siguientes métodos son exclusivos de lastr
clase:Los siguientes métodos son exclusivos de la
bytes
clase:fuente