Eu mudei recentemente para o Py 3.5. Este código estava funcionando corretamente no Python 2.7:
with open(fname, 'rb') as f:
lines = [x.strip() for x in f.readlines()]
for line in lines:
tmp = line.strip().lower()
if 'some-pattern' in tmp: continue
# ... code
Depois de atualizar para o 3.5, estou recebendo o:
TypeError: a bytes-like object is required, not 'str'
erro na última linha (o código de pesquisa padrão).
Eu tentei usar a .decode()
função em ambos os lados da instrução, também tentei:
if tmp.find('some-pattern') != -1: continue
- para nenhum proveito.
Consegui resolver quase todos os problemas 2: 3 rapidamente, mas esta pequena declaração está me incomodando.
result = requests.get
e tentox = result.content.split("\n")
. Estou um pouco confuso com a mensagem de erro, porque parece implicar queresult.content
é uma string e.split()
está exigindo um objeto semelhante a bytes .. ?? ( "Bytes de um objecto semelhante é necessária, não 'str"') ..Respostas:
Você abriu o arquivo no modo binário:
Isso significa que todos os dados lidos no arquivo são retornados como
bytes
objetos, nãostr
. Você não pode usar uma sequência em um teste de contenção:Você precisaria usar um
bytes
objeto para testartmp
:ou abra o arquivo como um arquivo de texto substituindo o
'rb'
modo por'r'
.fonte
'r'
vs'rb'
também , alternando entre os comportamentos dos arquivos binários e texto (como novas linhas traduzindo e em certas plataformas, como o marcador EOF é tratada). Que aio
biblioteca (fornecendo a funcionalidade de E / S padrão no Python 3, mas também disponível no Python 2) agora também decodifique arquivos de texto por padrão é a mudança real.'b'
sinalizador apenas quando tive que trabalhar com arquivos binários no DOS / Windows (como binário é o padrão do POSIX). É bom que haja um objetivo duplo ao usar oio
3.x para acesso a arquivos.Você pode codificar sua string usando
.encode()
Exemplo:
fonte
Como já foi mencionado, você está lendo o arquivo no modo binário e criando uma lista de bytes. No loop for a seguir, você está comparando string com bytes e é aí que o código está falhando.
Decodificar os bytes ao adicionar à lista deve funcionar. O código alterado deve ter a seguinte aparência:
O tipo de bytes foi introduzido no Python 3 e é por isso que seu código funcionou no Python 2. No Python 2 não havia tipo de dados para bytes:
fonte
Você precisa mudar de wb para w:
para
Depois de alterar isso, o erro desaparece, mas você não pode gravar no arquivo (no meu caso). Então, afinal, eu não tenho uma resposta?
Fonte: Como remover ^ M
Alterar para 'rb' gera outro erro: io.UnsupportedOperation: write
fonte
para este pequeno exemplo: soquete de importação
adicionar o "b" antes de 'GET http://www.py4inf.com/code/romeo.txt HTTP / 1.0 \ n \ n' resolver meu problema
fonte
Use a função encode () junto com o valor de String codificado, fornecido em uma única citação.
Ex:
OU
fonte
Você abriu o arquivo no modo binário:
O código a seguir lançará um TypeError: um objeto semelhante a bytes é necessário, não 'str'.
O código a seguir funcionará - você deve usar a função decode ():
fonte
por que não tentar abrir seu arquivo como texto?
Além disso, aqui está um link para o python 3.x na página oficial: https://docs.python.org/3/library/io.html E esta é a função aberta: https://docs.python.org/3 /library/functions.html#open
Se você realmente está tentando lidar com isso como um binário, considere codificar sua string.
fonte
Eu recebi esse erro quando estava tentando converter um caractere (ou string) para
bytes
, o código era algo parecido com o Python 2.7:Esta é a maneira do Python 2.7 ao lidar com caracteres unicode.
Isso não funcionará com o Python 3.6, pois
bytes
requer um argumento extra para codificação, mas isso pode ser um pouco complicado, pois diferentes codificações podem gerar resultados diferentes:No meu caso, eu tive que usar
iso_8859_1
ao codificar bytes para resolver o problema.Espero que isso ajude alguém.
fonte