Python „Błąd składni: znak inny niż ASCII„ \ xe2 ”w pliku”

179

Piszę jakiś kod Pythona i otrzymuję komunikat o błędzie, tak jak w tytule, od przeszukiwania ma to związek z zestawem znaków.

Oto linia, która powoduje błąd

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

Nie mogę dowiedzieć się, jakiego znaku nie ma w zestawie ANSI ASCII? Ponadto wyszukiwanie „\ xe2” nie daje już informacji o tym, jaki znak ma wyglądać. Który znak w tym wierszu powoduje problem?

Widziałem także kilka poprawek tego problemu, ale nie jestem pewien, którego użyć. Czy ktoś może wyjaśnić, na czym polega problem (python nie interpretuje kodu Unicode, chyba że zostanie o to poproszony?) I jak mam go poprawnie wyjaśnić?

EDYCJA: Oto wszystkie wiersze w pobliżu tej, która zawiera błędy

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
źródło
63
dodaj # kodowanie: utf-8 na górze pliku.
Mutant
2
Nie ma problemu z tym, co opublikowałeś; spójrz w pobliskie linie.
uprzejmie
Dodano rodzaj edycji, widzisz coś w tych wierszach?
KDecker
3
Próbowałeś sugestii Mutanta? Czy masz „inteligentne cytaty” (rodzaj zakrzywiony i / lub pod kątem) gdziekolwiek w pliku?
John Y
2
Jednym z przykładów, który może to spowodować, jest EN DASH ( - \xe2\x80\x93)
Martin Thoma,

Odpowiedzi:

145

Opływasz błąkany bajt. Możesz go znaleźć, uruchamiając

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

gdzie należy zastąpić "x.py"nazwą swojego programu. Zobaczysz numer linii i linie obrażające. Na przykład po arbitralnym wstawieniu tego bajtu otrzymałem:

4 "\xe2        lb = conn.create_load_balancer('my_lb', ['us-east-1a', 'us-east-1b'],[(80, 8080, 'http'), (443, 8443, 'tcp')])\n"
DSM
źródło
2
Dzięki to bardzo pomogło! Nadal nie jestem pewien, jaka jest / była karta. W końcu rzuciłem kod do notatnika i zapisałem jako ASCII, a następnie wkleiłem.
KDecker
Ja też się z tym zmierzyłem, co, jak sądzę, było spowodowane pewnym problemem z wklejaniem kopii, w którym postać pojawiła się w edytorze (vim) jako biała spacja.
Samveen,
Może być konieczne, aby python wiedział, że takie znaki istnieją z jakiegoś powodu, a nie tylko zbłąkanego bajtu. Zobacz rozwiązanie w odpowiedzi Chrisa Redforda.
prostu surowy
7
Miałem ten sam problem, znak \ xe2 był częścią łącznika „-” (\ xe2 \ x80 \ x93), ale nieco dłuższy niż ascii „-”. To dlatego, że wkleiłem tekst do vima, ale nie zwróciłem uwagi na ten dłuższy łącznik. Dla całej historii, stworzyłem tę postać z podwójnym łącznikiem „-” w tekście wiki (przy użyciu tkaniny)
PlasmaBinturong
1
Mój był w apostrofie - jak wO'Donnell
2490003
278

Jeśli próbujesz użyć znaków UTF-8 lub nie obchodzi Cię, czy znajdują się one w kodzie, dodaj ten wiersz do góry .pypliku

# -*- coding: utf-8 -*-
Chris Redford
źródło
1
dla mnie to nie działa. poniżej zawsze pojawia się błąd. Błąd składni: znak inny niż ASCII „\ xe2” w pliku /home/aslam/projects/deva_26nov/mylibrary/email_constants.py w linii 393, ale nie zadeklarowano kodowania; zobacz python.org/peps/pep-0263.html do szczegółów
Aslam Khan
2
Czy istnieje powód, dla którego nie jest to wybrana odpowiedź?
cph
@ cph Napisałem to 4 miesiące po zadaniu pytania :)
Chris Redford,
@ cph, ponieważ chociaż jest to bardzo pomocne, wybrana odpowiedź odpowiada na pytanie „jakiego znaku nie ma w zestawie ANSI ASCII?” Oba są świetnymi odpowiedziami i pierwsza zazwyczaj wygrywa w tym przypadku.
Arthur Dent
39

Lub możesz po prostu użyć:

# coding: utf-8

u góry pliku .py

Ysh
źródło
27

\ xe2 jest znakiem „-”, pojawia się w pewnej kopii i wkleja, używa innego jednakowo wyglądającego „-”, który powoduje błędy kodowania. Zamień „-” (z wklejania kopii) na poprawny „-” (z przycisku klawiatury).

André Liu
źródło
3
wielkie dzięki ! w moim przypadku była to postać „” ”
pietà
23

Zmień kodowanie znaków pliku,

zawsze umieszczaj poniżej wiersza na górze kodu

# -*- coding: utf-8 -*-
Dadaso Zanzane
źródło
10

Miałem ten sam błąd podczas kopiowania i wklejania komentarza z sieci

Dla mnie był to pojedynczy cytat (') w słowie

Właśnie go wymazałem i ponownie napisałem.

khalid sookia
źródło
Miałem ten sam błąd, ale podczas testowania lokalnego nie zepsuł się i nie zadziałał. Ale po uruchomieniu na serwerze dał ten błąd kodowania. Musiałem zastąpić komentarze pojedynczym cytatem do wersji utf-8.
shivgre
8

Dodanie wiersza # coding = utf-8 w pierwszym wierszu pliku .py rozwiąże problem.

Przeczytaj więcej na temat problemu i jego rozwiązania w poniższym linku, w tym artykule problem i jego rozwiązanie jest pięknie opisane: https://www.python.org/dev/peps/pep-0263/

Bhupinder Yadav
źródło
4

Wystąpił ten błąd dla znaków w moich komentarzach (z kopiowania / wklejania treści z Internetu do mojego edytora w celu robienia notatek).

Aby rozwiązać w Text Wrangler:

  1. Zaznacz tekst
  2. Przejdź do menu Tekst
  3. Wybierz „Konwertuj na ASCII”
Kat Russo
źródło
2
Opcja została zmieniona na text-> zap gremlins, w późniejszych wersjach TextWrangler, ale zadziałało dla mnie :-)
TheMethod
4

Na podstawie PEP 0263 - Definiowanie kodowania kodu źródłowego w języku 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
źródło
ale zadziałało od pierwszego komentarza do pytania, odpowiedź zawiera wyjaśnienie. dzięki
WebComer
3

Miałem ten sam problem i właśnie dodałem go na początku mojego pliku (w Python 3 nie miałem problemu, ale robiłem to w Python 2

#!/usr/local/bin/python
# coding: latin-1
Paul Z
źródło
2

Po około pół godzinie przeglądania przepełnienia stosu przyszło mi do głowy, że jeśli użycie pojedynczego cudzysłowu „” w komentarzu spowoduje błąd:

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

Po spojrzeniu na traceback udało mi się znaleźć pojedynczy cytat użyty w moim komentarzu.

Mark Austin
źródło
2

Jeśli to pomaga komukolwiek, dla mnie tak się stało, ponieważ próbowałem uruchomić implementację Django w python 3.4 za pomocą mojej komendy python 2.7

aless80
źródło
Nie korzystałem z Django, ale i tak mi to pomogło. Napisałem skrypt używając Pythona 3 i próbowałem uruchomić go w Pythonie 2. Błąd zniknął, gdy uruchomiłem go z odpowiednią wersją. Dzięki!
JustBlossom
1

Miałem właśnie ten problem z uruchomieniem prostego kodu .py poniżej:

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

Powyższy kod DSM zawiera następujące informacje:

1 „print \ xe2 \ x80 \ x98version to \ xe2 \ x80 \ x99, sys.version”

Problem polegał na tym, że mój edytor tekstów używał INTELIGENTNYCH CYTATÓW, jak sugerował John Y. Po zmianie ustawień edytora tekstu i ponownym otwarciu / zapisaniu pliku działa dobrze.

nagrom
źródło
1

Próbuję przeanalizować to dziwne apostraphe systemu Windows i po wypróbowaniu kilku rzeczy tutaj jest fragment kodu, który działa.

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
źródło
0

Miałem ten sam problem, ale było tak dlatego, że skopiowałem i wkleiłem ciąg bez zmian. Później, gdy ręcznie wpisałem ciąg, ponieważ błąd zniknął.

Miałem błąd z powodu -znaku. Kiedy zastąpiłem go ręcznym wprowadzeniem -błędu, problem został rozwiązany.

Skopiowany ciąg 10 + 3 * 5/(16 − 4)

Ręcznie wpisany ciąg 10 + 3 * 5/(16 - 4)

widać wyraźnie, że istnieje różnica między obydwoma łącznikami .

Myślę, że dzieje się tak z powodu różnych formatów używanych przez inny system operacyjny lub może po prostu inne oprogramowanie.

Mahi
źródło
0

Dla mnie problem spowodował ten symbol w cudzysłowie. Skopiowałem kod z pliku pdf, co spowodowało ten błąd. Właśnie zastąpiłem „” „tym” „”.

Vineet Bramhankar
źródło
0

Jeśli chcesz zauważyć, jaki znak to spowodował, po prostu przypisz problematyczną zmienną do łańcucha i wydrukuj go w konsoli iPython.

W moim przypadku

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!
miau miau
źródło
0

dla mnie problem został spowodowany przez wpisanie mojego kodu do Mac Notes, a następnie skopiowanie go z Mac Notes i wklejenie do mojej sesji vim, aby utworzyć mój plik. To sprawiło, że moje pojedyncze cytaty były zakrzywione. aby to naprawić, otworzyłem plik w vimie i zastąpiłem wszystkie moje zakrzywione pojedyncze cytaty prostym rodzajem, po prostu usuwając i przepisując ten sam znak. To Mac Notes sprawił, że ten sam naciśnięcie klawisza wygenerowało zakrzywiony pojedynczy cytat.

double07robinhood
źródło
0

Długo nie mogłem znaleźć problemu, ale później zdałem sobie sprawę, że skopiowałem wiersz „UTC-12: 00” z sieci i przyczyną tego problemu był łącznik / myślnik. Właśnie napisałem to ponownie „-” i problem został rozwiązany.

Czasami więc wklejone linie kopiowania również dają błędy. W takich przypadkach wystarczy ponownie napisać skopiowany kod i działa. Podczas ponownego pisania wyglądałoby na to, że nic się nie zmieniło, ale błąd zniknie.

Sugandha Jain
źródło
-1

Kiedy mam podobny problem podczas czytania plików tekstowych, używam ...

f = open('file','rt', errors='ignore')
Krzywka
źródło