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 bytescomo 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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *