Estou trabalhando com uma biblioteca que retorna uma string de bytes e preciso convertê-la em uma string.
Embora eu não tenha certeza de qual seja a diferença - se houver.
Supondo que o Python 3 (no Python 2, essa diferença seja um pouco menos bem definida) - uma string é uma sequência de caracteres, ou seja, pontos de código unicode ; esse é um conceito abstrato e não pode ser armazenado diretamente no disco. Uma string de bytes é uma sequência de bytes, sem surpresa, coisas que podem ser armazenadas em disco. O mapeamento entre eles é uma codificação - existem muitas delas (e infinitas são possíveis) - e você precisa saber o que se aplica no caso específico para fazer a conversão, pois uma codificação diferente pode mapear os mesmos bytes para uma sequência 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ς'
Depois de saber qual usar, você pode usar o .decode()
método da cadeia de bytes para obter a cadeia de caracteres correta como acima. Para completar, o .encode()
método de uma sequência de caracteres segue o caminho oposto:
>>> 'τoρνoς'.encode('utf-8')
b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'
str
tipo é o mesmo que obytes
tipo; esta resposta está comparando equivalentemente ounicode
tipo (não existe no Python 3) aostr
tipo.str
objetos Python 3 não é acessível ou relevante do lado Python; a estrutura de dados é apenas uma sequência de pontos de código. De acordo com o PEP 393 , a codificação interna exata é Latina-1, UCS2 ou UCS4, e uma representação utf-8 pode ser armazenada em cache após ser solicitada pela primeira vez, mas mesmo o código C é desencorajado de depender desses detalhes internos.A única coisa que um computador pode armazenar são bytes.
Para armazenar qualquer coisa em um computador, você deve primeiro codificá- lo, ou seja, convertê-lo em bytes. Por exemplo:
MP3
,WAV
etc.PNG
,JPEG
etc.ASCII
,UTF-8
etc.MP3
,WAV
,PNG
,JPEG
,ASCII
EUTF-8
são exemplos de codificações . Uma codificação é um formato para representar áudio, imagens, texto etc. em bytes.No Python, uma sequência de bytes é exatamente isso: uma sequência de bytes. Não é legível por humanos. Sob o capô, tudo deve ser convertido em uma sequência de bytes para que possa ser armazenado em um computador.
Por outro lado, uma cadeia de caracteres, geralmente chamada de "cadeia", é uma sequência de caracteres. É legível por humanos. Uma cadeia de caracteres não pode ser armazenada diretamente em um computador; ela deve ser codificada primeiro (convertida em uma cadeia de bytes). Existem várias codificações através das quais uma sequência de caracteres pode ser convertida em uma sequência de bytes, como
ASCII
eUTF-8
.O código Python acima codificará a string
'I am a string'
usando a codificaçãoASCII
. O resultado do código acima será uma sequência de bytes. Se você o imprimir, o Python o representará comob'I am a string'
. Lembre-se, no entanto, que as cadeias de bytes não são legíveis por humanos , é só que o Python as decodificaASCII
quando as imprime. No Python, uma sequência de bytes é representada por ab
, seguida pelaASCII
representação da sequência de bytes .Uma sequência de bytes pode ser decodificada novamente em uma sequência de caracteres, se você souber a codificação usada para codificá-la.
O código acima retornará a string original
'I am a string'
.Codificação e decodificação são operações inversas. Tudo deve ser codificado antes de poder ser gravado no disco e deve ser decodificado antes de poder ser lido por um ser humano.
fonte
Nota: Vou elaborar mais minha resposta para o Python 3, pois o final da vida útil do Python 2 está muito próximo.
No Python 3
bytes
consiste em sequências de valores não assinados de 8 bits, enquanto questr
consiste em sequências de pontos de código Unicode que representam caracteres textuais de idiomas humanos.Embora
bytes
estr
parecem funcionar da mesma maneira, suas instâncias não são compatíveis uns com os outros, ou seja,bytes
estr
instâncias não podem ser utilizados em conjunto com operadoras como>
e+
. Além disso, lembre-se de que a comparaçãobytes
e asstr
instâncias de igualdade, ou seja==
, o uso , sempre serão avaliadasFalse
mesmo quando elas contêm exatamente os mesmos caracteres.Outro problema ao lidar com
bytes
estr
está presente ao trabalhar com arquivos retornados usando aopen
função interna. Por um lado, se você deseja ler ou gravar dados binários de / para um arquivo, sempre abra o arquivo usando um modo binário como 'rb' ou 'wb'. Por outro lado, se você quiser ler ou gravar dados Unicode em / de um arquivo, esteja ciente da codificação padrão do seu computador; portanto, se necessário, passe oencoding
parâmetro para evitar surpresas.No Python 2
str
consiste em sequências de valores de 8 bits, enquanto queunicode
consiste em sequências de caracteres Unicode. Um aspecto a ter em mente é questr
eunicode
pode ser usado junto com os operadores, sestr
consistir apenas em caracteres ASCI de 7 bits.Pode ser útil usar funções auxiliares para converter entre
str
eunicode
no Python 2 e entrebytes
estr
no Python 3.fonte
Do que é Unicode :
Portanto, quando um computador representa uma sequência, ele encontra caracteres armazenados no computador da sequência através de seu número Unicode exclusivo e esses números são armazenados na memória. Mas você não pode gravar diretamente a sequência em disco ou transmiti-la na rede através do número Unicode exclusivo, porque esses números são apenas um número decimal simples. Você deve codificar a sequência de caracteres em bytes, como
UTF-8
.UTF-8
é uma codificação de caracteres capaz de codificar todos os caracteres possíveis e armazena caracteres como bytes (parece com isso ). Portanto, a cadeia codificada pode ser usada em qualquer lugar porqueUTF-8
é quase suportada em qualquer lugar. Quando você abre um arquivo de texto codificado emUTF-8
de outros sistemas, o computador o decodificará e exibirá os caracteres através do número Unicode exclusivo. Quando um navegador recebe dados de string codificadosUTF-8
da rede, ele os decodifica em string (assuma o navegador naUTF-8
codificação) e exibe a string.Em python3, você pode transformar string e string de bytes entre si:
Em uma palavra, string é para exibir para humanos ler em um computador e byte string é para armazenar em disco e transmissão de dados.
fonte
Unicode é um formato acordado para a representação binária de caracteres e vários tipos de formatação (por exemplo, letras minúsculas / maiúsculas, nova linha, retorno de carro) e outras "coisas" (por exemplo, emojis). Um computador não é menos capaz de armazenar uma representação unicode (uma série de bits), na memória ou em um arquivo, do que armazenar uma representação ascii (uma série diferente de bits) ou qualquer outra representação (série de bits) )
Para que a comunicação ocorra, as partes na comunicação devem concordar sobre qual representação será usada.
Como o unicode procura representar todos os caracteres possíveis (e outras "coisas") usados na comunicação entre humanos e entre computadores, requer um número maior de bits para a representação de muitos caracteres (ou coisas) do que outros sistemas de representação que procure representar um conjunto mais limitado de caracteres / coisas. Para "simplificar" e talvez acomodar o uso histórico, a representação unicode é quase exclusivamente convertida em outro sistema de representação (por exemplo, ascii) com o objetivo de armazenar caracteres em arquivos.
Não é o caso que o unicode não possa ser usado para armazenar caracteres em arquivos ou transmiti-los por qualquer canal de comunicação, simplesmente que não é .
O termo "string" não é definido com precisão. "String", em seu uso comum, refere-se a um conjunto de caracteres / coisas. Em um computador, esses caracteres podem ser armazenados em qualquer uma das diversas representações bit a bit. Uma "sequência de bytes" é um conjunto de caracteres armazenados usando uma representação que usa oito bits (oito bits sendo referidos como byte). Como atualmente, os computadores usam o sistema unicode (caracteres representados por um número variável de bytes) para armazenar caracteres na memória e cadeias de bytes (caracteres representados por bytes únicos) para armazenar caracteres em arquivos, uma conversão deve ser usada antes dos caracteres representados na memória serão movidos para o armazenamento em arquivos.
fonte
Vamos ter uma cadeia simples de um caractere
'š'
e codificá-la em uma sequência de bytes:Para os fins deste exemplo, vamos exibir a sequência de bytes em sua forma binária:
Agora, geralmente não é possível decodificar as informações sem saber como elas foram codificadas. Somente se você souber que a
utf-8
codificação de texto foi usada, poderá seguir o algoritmo para decodificar utf-8 e adquirir a sequência original:Você pode exibir o número binário de
101100001
volta como uma sequência:fonte
As linguagens Python incluem
str
ebytes
como "Tipos incorporados" padrão. Em outras palavras, são duas classes. Eu não acho que vale a pena tentar racionalizar por que o Python foi implementado dessa maneira.Dito isto,
str
ebytes
são muito parecidos entre si. Ambos compartilham a maioria dos mesmos métodos. Os seguintes métodos são exclusivos para astr
classe:Os seguintes métodos são exclusivos para a
bytes
classe:fonte