Python “SyntaxError: caractere não ASCII '\ xe2' no arquivo”

179

Estou escrevendo algum código python e estou recebendo a mensagem de erro como no título, ao pesquisar isso tem a ver com o conjunto de caracteres.

Aqui está a linha que causa o erro

hc = HealthCheck("instance_health", interval=15, target808="HTTP:8080/index.html")

Não consigo descobrir qual caractere não está no conjunto ANSI ASCII? Além disso, a pesquisa "\ xe2" não fornece mais informações sobre qual caractere aparece. Qual personagem dessa linha está causando o problema?

Também vi algumas correções para esse problema, mas não sei qual usar. Alguém poderia esclarecer qual é o problema (python não interpreta unicode, a menos que seja solicitado a fazê-lo?), E como eu o esclareceria corretamente?

EDIT: Aqui estão todas as linhas próximas a que erros

def createLoadBalancer():
    conn = ELBConnection(creds.awsAccessKey, creds.awsSecretKey)
    hc = HealthCheck("instance_health", interval=15, target808="HTTP:8080/index.html")
    lb = conn.create_load_balancer('my_lb', ['us-east-1a', 'us-east-1b'],[(80, 8080, 'http'), (443, 8443, 'tcp')])
    lb.configure_health_check(hc)
    return lb
KDecker
fonte
63
adicione # coding: utf-8 na parte superior do arquivo.
Mutant
2
Não há problema no que você postou; procure em linhas próximas.
Kindall
Adicionou uma edição kindall, vê alguma coisa nessas linhas?
KDecker
3
Você tentou a sugestão de Mutant? Você tem "aspas inteligentes" (do tipo curvo e / ou angulado) em algum lugar do arquivo?
John
2
Um exemplo que pode causar isso é um EN DASH ( - \xe2\x80\x93)
Martin Thoma

Respostas:

145

Você tem um byte perdido flutuando. Você pode encontrá-lo executando

with open("x.py") as fp:
    for i, line in enumerate(fp):
        if "\xe2" in line:
            print i, repr(line)

onde você deve substituir "x.py"pelo nome do seu programa. Você verá o número da linha e a (s) linha (s) ofensiva (s). Por exemplo, depois de inserir esse byte arbitrariamente, obtive:

4 "\xe2        lb = conn.create_load_balancer('my_lb', ['us-east-1a', 'us-east-1b'],[(80, 8080, 'http'), (443, 8443, 'tcp')])\n"
DSM
fonte
2
Obrigado, isso ajudou muito! Ainda não tenho certeza de qual é a carta. Acabei jogando o código no bloco de notas e salvando como ASCII e colando.
KDecker
Eu também enfrentei isso, o que acho que foi devido a algum problema de copiar e colar, onde o personagem apareceu como espaço em branco no editor (vim).
Samveen 5/11
Pode ser necessário que o python saiba que esses caracteres existem por um motivo e não apenas um byte perdido. Veja a solução na resposta de Chris Redford.
precisa
7
Eu tive o mesmo problema, o caractere \ xe2 fazia parte de um hífen "-" (\ xe2 \ x80 \ x93), mas um pouco mais longo que o ascii "-". Isso porque colei o texto no vim, mas não prestei atenção a esse hífen mais longo. Para a história completa, eu produzi este personagem com um duplo hífen "-" em um texto wiki (usando têxtil)
PlasmaBinturong
1
O meu estava em um apóstrofo - como emO'Donnell
user2490003
278

Se você está apenas tentando usar caracteres UTF-8 ou não se importa se eles estão no seu código, adicione esta linha ao topo do seu .pyarquivo

# -*- coding: utf-8 -*-
Chris Redford
fonte
1
para mim não está funcionando. abaixo erro mostrando sempre. SyntaxError: caractere não ASCII '\ xe2' no arquivo /home/aslam/projects/deva_26nov/mylibrary/email_constants.py na linha 393, mas nenhuma codificação declarada; veja python.org/peps/pep-0263.html para mais detalhes
Aslam Khan
2
Existe uma razão para esta não ser uma resposta escolhida?
Cph
@cph eu escrevi 4 meses após a pergunta foi feita :)
Chris Redford
@ cph porque, embora isso seja muito útil, a resposta escolhida responde à pergunta de "que caractere não está no conjunto ANSI ASCII?" Porém, ambas são boas respostas e a primeira geralmente vence nesse caso.
Arthur Dent
39

Ou você pode simplesmente usar:

# coding: utf-8

na parte superior do arquivo .py

Ysh
fonte
27

\ xe2 é o caractere '-', aparece em algumas cópias e colas e usa um 'igual' de aparência diferente - que causa erros de codificação. Substitua o '-' (da pasta copiar) pelo '-' correto (do botão do teclado).

André Liu
fonte
3
Muito obrigado ! no meu caso, era o caractere "'"
pietà
23

Altere a codificação de caracteres do arquivo,

coloque a linha abaixo no topo do seu código sempre

# -*- coding: utf-8 -*-
Dadaso Zanzane
fonte
10

Eu tive o mesmo erro ao copiar e colar um comentário da Web

Para mim, era uma citação simples (') na palavra

Eu apenas apaguei e digitei novamente.

khalid sookia
fonte
Eu tive o mesmo erro, mas durante o teste local, ele não quebrou e funcionou. Mas quando executado no servidor, deu esse erro de codificação. Teve que substituir os comentários entre aspas para a versão utf-8.
shivgre
8

Adicionar a linha # coding = utf-8 na primeira linha do seu arquivo .py corrigirá o problema.

Por favor, leia mais sobre o problema e sua correção no link abaixo, neste artigo, o problema e sua solução são bem descritos: https://www.python.org/dev/peps/pep-0263/

Bhupinder Yadav
fonte
4

Eu recebi esse erro para caracteres nos meus comentários (de copiar / colar conteúdo da Web no meu editor para anotações).

Para resolver no Text Wrangler:

  1. Destacar o texto
  2. Vá para o menu Texto
  3. Selecione "Converter em ASCII"
Kat Russo
fonte
2
Opção foi alterada para texto-> zap gremlins, em versões posteriores do TextWrangler mas funcionou para mim :-)
TheMethod
4

Baseado em PEP 0263 - Definindo codificações de código-fonte Python

Python will default to ASCII as standard encoding if no other
encoding hints are given.

To define a source code encoding, a magic comment must
be placed into the source files either as first or second
line in the file, such as:

      # coding=<encoding name>

or (using formats recognized by popular editors)

      #!/usr/bin/python
      # -*- coding: <encoding name> -*-

or

      #!/usr/bin/python
      # vim: set fileencoding=<encoding name> :
caot
fonte
No entanto, funcionou desde o primeiro comentário até a pergunta, a resposta contém a explicação. obrigado
WebComer
3

Eu tive o mesmo problema e acabei de adicioná-lo ao topo do meu arquivo (no Python 3 eu não tive o problema, mas o faço no Python 2

#!/usr/local/bin/python
# coding: latin-1
Paul Z
fonte
2

Após cerca de meia hora de análise do estouro da pilha, ocorreu-me que, se o uso de uma única citação "'" em um comentário, ocorrerá o erro:

SyntaxError: Non-ASCII character '\xe2' in file

Depois de analisar o rastreio, consegui localizar a citação única usada no meu comentário.

Mark Austin
fonte
2

Se isso ajuda alguém, para mim isso aconteceu porque eu estava tentando executar uma implementação do Django no python 3.4 com o meu comando python 2.7

aless80
fonte
Não estava usando o Django, mas isso ainda me ajudou. Eu escrevi o script usando python 3 e tentei executá-lo com python 2. O erro desapareceu quando o executei com a versão correta. Obrigado!
JustBlossom
1

Eu tive esse problema exato executando o código .py simples abaixo:

import sys
print 'version is:', sys.version

O código do DSM acima forneceu o seguinte:

1 'imprimir \ xe2 \ x80 \ x98versão é \ xe2 \ x80 \ x99, sys.version'

Portanto, a questão era que meu editor de texto usava SMART QUOTES, como John Y sugeriu. Depois de alterar as configurações do editor de texto e reabrir / salvar o arquivo, ele funciona perfeitamente.

Nagrom
fonte
1

Estou tentando analisar esse apóstrofo estranho do Windows e depois de tentar várias coisas aqui é o trecho de código que funciona.

def convert_freaking_apostrophe(self,string):

   try:
      issuer_rename = string.decode('windows-1252')
   except:
      issuer_rename = string.decode('latin-1')
   issuer_rename = issuer_rename.replace(u'’', u"'")
   issuer_rename = issuer_rename.encode('ascii','ignore')
   try:
      os.rename(directory+"/"+issuer,directory+"/"+issuer_rename)
      print "Successfully renamed "+issuer+" to "+issuer_rename
      return issuer_rename
   except:
      pass

#HANDLING FOR FUNKY APOSTRAPHE
if re.search(r"([\x90-\xff])", issuer):
   issuer = self.convert_freaking_apostrophe(issuer)
Chris
fonte
0

Eu tive o mesmo problema, mas foi porque copiei e colei a string como ela é. Mais tarde, quando eu digitei manualmente a string, pois o erro desapareceu.

Eu tive o erro devido ao -sinal. Quando o substituí pela entrada manual de um -erro foi resolvido.

Sequência copiada 10 + 3 * 5/(16 − 4)

String digitada manualmente 10 + 3 * 5/(16 - 4)

você pode ver claramente que há um pouco de diferença entre os dois hífens .

Eu acho que é por causa da formatação diferente usada por diferentes sistemas operacionais ou talvez apenas software diferente.

Mahi
fonte
0

Para mim, o problema causou devido a "'" esse símbolo entre aspas. Como eu havia copiado o código de um arquivo pdf, ele causou esse erro. Acabei de substituir "'" por este "'".

Vineet Bramhankar
fonte
0

Se você deseja identificar qual caractere causou isso, atribua a variável problemática a uma string e imprima-a no console do iPython.

No meu caso

In [1]: array = [[24.9, 50.5]​, [11.2, 51.0]]        # Raises an error

In [2]: string = "[[24.9, 50.5]​, [11.2, 51.0]]"     # Manually paste the above array here

In [3]: string
Out [3]: '[[24.9, 50.5]\xe2\x80\x8b, [11.2, 51.0]]' # Here they are!
meowmeow
fonte
0

para mim, o problema foi causado ao digitar meu código no Mac Notes e copiá-lo do Mac Notes e colá-lo na minha sessão do vim para criar meu arquivo. Isso fez minhas aspas simples serem do tipo curvo. para corrigi-lo, abri meu arquivo no vim e substitui todas as minhas aspas simples curvas pelo tipo reto, apenas removendo e redigitando o mesmo caractere. Foi o Mac Notes que fez o mesmo toque de tecla produzir a aspas simples curvas.

double07robinhood
fonte
0

Não consegui encontrar o problema por muito tempo, mas depois percebi que havia copiado uma linha "UTC-12: 00" da Web e o hífen / traço estava causando o problema. Acabei de escrever este "-" novamente e o problema foi resolvido.

Portanto, às vezes as linhas coladas da cópia também apresentam erros. Nesses casos, basta reescrever o código colado da cópia e ele funciona. Ao reescrever, parece que nada foi alterado, mas o erro desapareceu.

Sugandha Jain
fonte
-1

Quando tenho um problema semelhante ao ler arquivos de texto, uso ...

f = open('file','rt', errors='ignore')
Cam
fonte