Decodificação de Strings
As strings em Python são armazenadas como Unicode. Isso significa que cada caractere em uma string é representado por um ponto de código. Para armazenamento eficiente dessas strings, a sequência de pontos de código precisa ser representada na memória como um conjunto de unidades de código. As unidades de código são mapeadas para bytes de 8 bits. As regras para traduzir uma string Unicode em uma sequência de bytes são chamadas de codificação de caracteres ou apenas uma codificação. Consequentemente, a codificação de strings é uma prática essencial para armazenamento.
Uma vez que as strings são codificadas para bytes, elas precisam ser decodificadas novamente em strings para poderem ser lidas. Portanto, semelhante à codificação de uma string, podemos realizar a decodificação de strings a partir de um fluxo de bytes usando a função decode(). Ou seja, decode() é usado em objetos bytes, enquanto encode() é usado em objetos string.
Decodificação de strings em Python com decode()
O método decode() é usado para converter bytes em uma string. É o oposto de encode(), que converte uma string em bytes. A decodificação depende do formato no qual uma string foi codificada. A sintaxe básica é mostrada abaixo:
bytes_object.decode(encoding, errors)
No trecho acima, encoding representa o formato de decodificação e errors é um argumento opcional que informa como o método deve proceder em caso de erros. O parâmetro bites_object se refere ao objeto bytes que precisa ser convertido. Se a decodificação não for especificada no decode(), UTF-8 é o padrão. As codificações comuns incluem ‘utf-8’, ‘ascii’, ‘latin-1’, ‘cp1252’, etc. Veja um exemplo ilustrativo:
a = 'a frequência de ocorrências de acidentes é alta em São Paulo.'
# Primeiro realizamos a codificação com UTF-8 para converter a string em bytes
string_codificada = a.encode('utf-8')
print(string_codificada)
# resultado: b'a frequ\xc3\xaancia de ocorr\xc3\xaancias de acidentes \xc3\xa9 alta em S\xc3\xa3o Paulo.'
# decodificação de bytes em string
string_decodificada = string_codificada.decode('utf-8')
print(string_decodificada)
# resultado: a frequência de ocorrências de acidentes é alta em São Paulo.
Neste exemplo, primeiro convertemos a string em bytes com encode() para podermos posteriormente realizar a decodificação de strings com decode().
Lidando com Erros
Como a codificação e a decodificação de uma string de entrada dependem do formato, é preciso ter cuidado ao codificar/decodificar. Se usarmos o formato errado, isso resultará em erros. O trecho abaixo mostra a importância da codificação e decodificação nos formatos corretos. A primeira decodificação está incorreta, pois tenta decodificar uma string de entrada codificada no formato UTF-8 como ASCII. O segundo exemplo está correto, pois os formatos de codificação e decodificação são os mesmos.
# tenta decodificar com formato errado
string_codificada = b'a frequ\xc3\xaancia de ocorr\xc3\xaancias de acidentes \xc3\xa9 alta em S\xc3\xa3o Paulo.'
string_decodificada1 = string_codificada.decode('ascii')
print(string_decodificada1)
# 'ascii' codec can't decode byte 0xc3 in position 7: ordinal not in range(128)
# decodificação com formato correto
string_decodificada2 = string_codificada.decode('utf-8')
print(string_decodificada2)
# resultado: a frequência de ocorrências de acidentes é alta em São Paulo.
Uma forma alternativa de evitar os erros é especificar no método decode() argumentos como ‘ignore’ para ignorar dados inválidos ou ‘replace’, para substituir dados inválidos por um marcador de substituição. Veja exemplos ilustrativos abaixo:
# ignore
string_codificada = b'a frequ\xc3\xaancia de ocorr\xc3\xaancias de acidentes \xc3\xa9 alta em S\xc3\xa3o Paulo.'
string_decodificada1 = string_codificada.decode(encoding='ascii', errors='ignore') # ignora erros
print(string_decodificada1)
# resultado: a frequncia de ocorrncias de acidentes alta em So Paulo.
# replace
string_decodificada2 = string_codificada.decode(encoding='ascii', errors='replace') # substitui erros
print(string_decodificada2)
# resultado: a frequ��ncia de ocorr��ncias de acidentes �� alta em S��o Paulo.
Também é importante mencionar que existem ferramentas como chardet que auxiliam na identificação do formato de codificação.
Veja também:
Encontrou algum erro ou quer fazer uma sugestão? Por favor, entre em contato usando nosso formulário de contatos.