Introdução
Neste artigo, veremos como converter Bytes em Cordas em Python. No final deste artigo, terá uma ideia clara do que são estes tipos e como lidar eficazmente com os dados utilizando-os.
Dependente da versão de Python que estiver a utilizar, esta tarefa será diferente. Embora Python 2 tenha atingido o seu fim de vida, muitos projectos ainda o utilizam, por isso vamos incluir tanto a aproximação de Python 2 como Python 3.
Converta Bytes a String em Python 3
Desde Python 3, a velha forma ASCII de fazer as coisas tinha de desaparecer, e Python tornou-se completamente Unicode.
Isto significa que perdemos o tipo unicode explícito: – cada string é um u"string"
!
Para diferenciar estas cordas dos bons velhos bytestrings, somos introduzidos a um novo especificador para eles – o b"string"
.
Este foi adicionado em Python 2.6, mas não serviu nenhum propósito real a não ser o de se preparar para Python 3, pois todas as cordas foram bytestrings em 2.6.
Bytestrings em Python 3 são oficialmente chamados bytes
, uma sequência imutável de inteiros no intervalo 0 <= x < 256. Outro bytes
como o objecto adicionado em 2.6 é o bytearray
– semelhante a bytes
, mas mutável.
Converta Bytes para String com descodificação()
Vejamos como podemos converter bytes para String, usando o método incorporado decode()
para a classe bytes
:
passando o formato de codificação, descodificamos o objecto bytes
numa corda e imprimimo-lo.
Converter Bytes para String com codecs
Alternativamente, podemos usar o módulo incorporado codecs
para este fim também:
>>> import codecs>>> b = b'Lets grab a \xf0\x9f\x8d\x95!'>>> codecs.decode(b, 'UTF-8')"Let's grab a 🍕!"
Não é realmente necessário passar no parâmetro de codificação, no entanto, aconselha-se a passá-lo para dentro:
>>> codecs.decode(b)"Let's grab a 🍕!"
Converta Bytes para String com str()
Finalmente, pode usar a função str()
, que aceita vários valores e os converte em strings:
>>> b = b'Lets grab a \xf0\x9f\x8d\x95!'>>> str(b, 'UTF-8')"Let's grab a 🍕!"
Cutifique-se de fornecer o argumento de codificação a str()
embora, caso contrário poderá obter alguns resultados inesperados:
Isto leva-nos mais uma vez às codificações. Se especificar a codificação errada, o melhor caso é o seu programa falhar porque não consegue descodificar os dados. Por exemplo, se tentássemos usar a função str()
com UTF-16
, seríamos saudados com:
>>> str(b, 'UTF-16')'敌❴\u2073牧扡愠\uf020趟↕'
Isto é ainda mais importante dado que Python 3 gosta de assumir Unicode – portanto, se estiver a trabalhar com ficheiros ou fontes de dados que utilizam uma codificação obscura, certifique-se de prestar atenção extra.
Converta Bytes para String em Python 2
Em Python 2, um pacote de bytes e uma string são praticamente a mesma coisa – strings são objectos que consistem em caracteres de 1 byte de comprimento, o que significa que cada caracter pode armazenar 256 valores. É por isso que por vezes são chamados bytestrings.
Isto é óptimo quando se trabalha com dados de bytes – basta carregá-los numa variável e estamos prontos para imprimir:
>>> s = "Hello world!">>> s'Hello world!'>>> len(s)12
Usar caracteres Unicode em bytestrings altera um pouco este comportamento:
>>> s = "Let's grab a 🍕!">>> s'Lets grab a \xf0\x9f\x8d\x95!'# Where has the pizza gone to?>>> len(s)17# Shouldn't that be 15?
Converter Bytes para Unicode (Python 2)
Aqui, teremos de usar o tipo Python 2’s Unicode
, que é assumido e usado automaticamente em Python 3. Isto armazena cordas como uma série de pontos de código, em vez de bytes.
O \xf0\x9f\x8d\x95
representa os bytes como números hexadecimais de dois dígitos, uma vez que Python não sabe como representá-los como caracteres ASCII:
>>> u = u"Let's grab a 🍕!"u"Let's grab a \U0001f355!"">>> u"Let's grab a 🍕!"# Yum.>>> len(u)15
Como pode ver acima, a string Unicode contém \U0001f355
– um caracter fugido Unicode que o nosso terminal sabe agora como imprimir como uma fatia de pizza! Definir isto foi tão fácil como usar o u
especificador antes do valor do bytestring.
Então, como posso alternar entre os dois?
Você pode obter a string Unicode descodificando o seu bytestring. Isto pode ser feito através da construção de um objecto Unicode, fornecendo o bytestring e uma string contendo o nome codificador como argumentos ou chamando .decode(encoding)
a um bytestring.
Converta Bytes para String Utilizando decodificação() (Python 2)
Também se pode utilizar o módulo codecs.encode(s, encoding)
do módulo codecs
.
>>> s = "Let's grab a \xf0\x9f\x8d\x95!">>> u = unicode(s, 'UTF-8')>>> u"Let's grab a 🍕!">>> s.decode('UTF-8')"Let's grab a 🍕!"
Converta Bytes para String Utilizando codecs (Python 2)
Or, utilizando o módulo codecs
:
import codecs>>> codecs.decode(s, 'UTF-8')"Let's grab a 🍕!"
Esteja atento à sua Codificação
Uma palavra de prudência aqui – os bytes podem ser interpretados de forma diferente em diferentes codificações. Com cerca de 80 codificações diferentes disponíveis fora da caixa, pode não ser fácil saber se tem a codificação certa!
A mensagem original era øç
ou јч
, e ambas parecem ser conversões válidas.
Conclusão
Como programadores, há algumas coisas em que temos de pensar constantemente e preparar activamente, a fim de evitar armadilhas. Isto é especialmente verdade nos níveis inferiores, onde raramente vamos quando usamos uma linguagem de alto nível como Python como nosso condutor diário.
Coisas como charsets, codificações e binários estão lá para nos lembrar que o nosso trabalho é codificar – codificar os nossos pensamentos em soluções de trabalho. Felizmente, muito deste pensamento torna-se parte da nossa rotina após algumas rondas no teclado.
Neste artigo, analisámos como converter bytes para Strings em Python.