Python SyntaxError: niet-ASCII-teken ‘\xe2’ in bestand [duplicaat]

Ik ben wat python-code aan het schrijven en ik krijg de foutmelding zoals in de titel, bij het zoeken heeft dit te maken met de tekenset.

Dit is de regel die de fout veroorzaakt

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

Ik kan er niet achter komen welk teken niet in de ANSI ASCII-set zit? Verder geeft het zoeken op “\xe2” geen informatie meer over het teken dat verschijnt. Welk teken in die regel veroorzaakt het probleem?

Ik heb ook een paar oplossingen voor dit probleem gezien, maar ik weet niet zeker welke ik moet gebruiken. Kan iemand verduidelijken wat het probleem is (python interpreteert unicode niet tenzij dit wordt gevraagd?) en hoe ik het op de juiste manier kan oplossen?

BEWERKEN:
Hier zijn alle regels in de buurt van degene die fouten bevat

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

Antwoord 1, autoriteit 100%

Er zweeft een verdwaalde byte rond. Je kunt het vinden door

. uit te voeren

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

waar je "x.py" moet vervangen door de naam van je programma. U ziet het regelnummer en de overtredende regel(s). Nadat ik die byte willekeurig had ingevoegd, kreeg ik bijvoorbeeld:

4 "\xe2        lb = conn.create_load_balancer('my_lb', ['us-east-1a', 'us-east-1b'],[(80, 8080, 'http'), (443, 8443, 'tcp')])\n"

Antwoord 2, autoriteit 93%

Als je alleen UTF-8-tekens probeert te gebruiken of het je niet uitmaakt of ze in je code staan, voeg dan deze regel toe aan de bovenkant van je .py-bestand

# -*- coding: utf-8 -*-

Antwoord 3, autoriteit 27%

Of je kunt gewoon het volgende gebruiken:

# coding: utf-8

bovenaan het .py-bestand


Antwoord 4, autoriteit 19%

\xe2 is het ‘-‘-teken, het verschijnt in sommige gevallen van kopiëren en plakken, het gebruikt een andere gelijk uitziende ‘-‘ die coderingsfouten veroorzaakt.
Vervang de ‘-‘(van kopiëren en plakken) door de juiste ‘-‘ (van je toetsenbordknop).


Antwoord 5, autoriteit 15%

Wijzig de tekencodering van het bestand,

zet de onderste regel altijd bovenaan je code

# -*- coding: utf-8 -*-

Antwoord 6, autoriteit 8%

Ik had dezelfde fout bij het kopiëren en plakken van een reactie van internet

Voor mij was het een enkel aanhalingsteken (‘) in het woord

Ik heb het zojuist gewist en opnieuw getypt.


Antwoord 7, autoriteit 6%

Het toevoegen van # coding=utf-8 regel in de eerste regel van uw .py-bestand zal het probleem oplossen.

Lees meer over het probleem en de oplossing op onderstaande link, in dit artikel wordt het probleem en de oplossing prachtig beschreven: https://www.python.org/dev/peps/pep-0263/


Antwoord 8, autoriteit 3%

Ik kreeg deze fout voor tekens in mijn opmerkingen (van het kopiëren/plakken van inhoud van internet naar mijn editor voor het maken van aantekeningen).

Oplossen in Text Wrangler:

  1. Markeer de tekst
  2. Ga naar het menu Tekst
  3. Selecteer “Converteren naar ASCII”

Antwoord 9, autoriteit 3%

Gebaseerd op PEP 0263 — Python-broncodecoderingen definiëren

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> :

Antwoord 10, autoriteit 2%

Als het iemand helpt, voor mij gebeurde dat omdat ik een Django-implementatie in python 3.4 probeerde uit te voeren met mijn python 2.7-opdracht


Antwoord 11, autoriteit 2%

Ik had hetzelfde probleem en heb dit zojuist bovenaan mijn bestand toegevoegd (in Python 3 had ik het probleem niet, maar in Python 2 wel

#!/usr/local/bin/python
# coding: latin-1

Antwoord 12, autoriteit 2%

Mijn geval \xe2 was een die moet worden vervangen door '.

Over het algemeen raad ik aan om UTF-8 naar ASCII te converteren met b.v. https://onlineasciitools.com/convert-utf8-to-ascii

Als u echter UTF-8 wilt behouden, kunt u

#-*- mode: python -*-
# -*- coding: utf-8 -*-

Antwoord 13

Na ongeveer een half uur door de stack-overflow te hebben gekeken, drong het tot me door dat als het gebruik van een enkel aanhalingsteken ” ‘ ” in een opmerking door de fout:

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

Na het bekijken van de traceback kon ik het enkele aanhalingsteken vinden dat in mijn opmerking werd gebruikt.


Antwoord 14

Ik had precies dit probleem bij het uitvoeren van de eenvoudige .py-code hieronder:

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

De bovenstaande DSM-code leverde het volgende op:

1 ‘print \xe2\x80\x98version is\xe2\x80\x99, sys.version’

Het probleem was dus dat mijn teksteditor SMART QUOTES gebruikte, zoals John Y suggereerde. Na het wijzigen van de instellingen van de teksteditor en het opnieuw openen/opslaan van het bestand, werkt het prima.


Antwoord 15

Ik probeer die rare Windows-apostraf te ontleden en na verschillende dingen geprobeerd te hebben is hier het codefragment dat werkt.

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)

Antwoord 16

Ik had hetzelfde probleem, maar dat kwam omdat ik de string heb gekopieerd en geplakt zoals hij is.
Later, toen ik de string handmatig typte, is de fout verdwenen.

Ik had de fout vanwege het - teken. Toen ik het verving door handmatig een - in te voeren, was de fout opgelost.

Gekopieerde tekenreeks 10 + 3 * 5/(16 ? 4)

Handmatig getypte string 10 + 3 * 5/(16 - 4)

je kunt duidelijk zien dat er een klein verschil is tussen beide koppeltekens.

Ik denk dat het komt door de verschillende opmaak die door verschillende besturingssystemen wordt gebruikt of misschien gewoon door andere software.


Antwoord 17

Voor mij was het probleem veroorzaakt door ” ” dat symbool tussen de aanhalingstekens. Omdat ik de code uit een pdf-bestand had gekopieerd, veroorzaakte het die fout. Ik heb zojuist ” ” vervangen door deze “‘”.


Antwoord 18

Als je wilt zien welk karakter dit heeft veroorzaakt, wijs dan de problematische variabele toe aan een string en druk deze af in een iPython-console.

In mijn geval

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!

Antwoord 19

voor mij werd het probleem veroorzaakt door mijn code in Mac Notes te typen en deze vervolgens van Mac Notes te kopiëren en in mijn vim-sessie te plakken om mijn bestand te maken. Dit maakte mijn enkele aanhalingstekens het gebogen type. om het te repareren opende ik mijn bestand in vim en verving al mijn gebogen enkele aanhalingstekens door de rechte soort, gewoon door hetzelfde teken te verwijderen en opnieuw te typen. Het was Mac Notes die ervoor zorgde dat dezelfde toetsaanslag het gebogen enkele aanhalingsteken produceerde.


Antwoord 20

Ik heb lang niet kunnen vinden wat het probleem is, maar later realiseerde ik me dat ik een regel “UTC-12:00” van internet had gekopieerd en het koppelteken/streepje hierin veroorzaakte het probleem. Ik heb zojuist deze “-” opnieuw geschreven en het probleem is opgelost.

Dus soms geven de gekopieerde regels ook fouten. In dergelijke gevallen, herschrijft u gewoon de gekopieerde code en het werkt. Bij het herschrijven lijkt het alsof er niets is veranderd, maar de fout is verdwenen.


Antwoord 21

Veel goede oplossingen hier.

Een uitdaging die in geen van hen echt aan bod komt, is hoe je bepaalde moeilijk te herkennen niet-ASCII-tekens visueel kunt identificeren die lijken op andere gewone ASCII-tekens. En streepjes kunnen bijvoorbeeld bijna precies hetzelfde zijn als koppeltekens en gekrulde aanhalingstekens lijken veel op rechte aanhalingstekens, afhankelijk van het lettertype van uw teksteditor.

Deze one-liner, die zou moeten werken op Mac of Linux, verwijdert tekens die niet in het ASCII-afdrukbare bereik liggen en toont u de verschillen naast elkaar:

# assumes Bash shell; for Bourne shell (sh), rearrange as a pipe and
# give '-' as second argument to 'sdiff' instead
sdiff --suppress-common-lines script.py <(tr -cd '\11\12\15\40-\176' <script.py)

De tekens \11, \12 en \15 zijn respectievelijk tab, nieuwe regel en regelterugloop in octaal; het resterende bereik zijn de zichtbare ASCII-tekens. (hoedentip)

Een andere tip verkregen uit deze SO-thread gebruikt een inverse tekenklasse die bestaat uit alles wat niet is in het zichtbare ASCII-bereik en markeert het:

grep --color '[^ -~]' script.py

Dit zou ook prima moeten werken met de macOS/BSD-versie van grep.


Antwoord 22

Ik heb dit opgelost met pycharm. Onderaan pycharm ziet u bestandscodering. Ik zag dat het UT-8 is. Ik heb het gewijzigd in US-ASCII
pycharm-codering afbeelding


Antwoord 23

Als ik een soortgelijk probleem heb bij het lezen van tekstbestanden, gebruik ik…

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

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes