Python "SyntaxError: символ, що не ASCII" \ xe2 'у файлі "


179

Я пишу якийсь код python, і отримую повідомлення про помилку, як у заголовку, від пошуку це пов'язано з набором символів.

Ось рядок, який викликає помилку

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

Я не можу зрозуміти, який символ не є в наборі ANSI ASCII? Крім того, пошук "\ xe2" більше не дає інформації про те, який символ відображається. Який символ у цьому рядку викликає проблему?

Я також побачив декілька виправлень цієї проблеми, але я не знаю, які використовувати. Невже хтось може уточнити, у чому полягає проблема (python не інтерпретує unicode, якщо не сказано про це?), І як я б це ліквідував належним чином?

EDIT: Ось усі рядки поруч із тим, що помиляється

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

63
додати # кодування: utf-8 зверху файлу.
Мутант

2
У тому, що ви розмістили, немає жодної проблеми; зазирнути в сусідні рядки.
kindall

Додано редагування kindall, бачите щось у цих рядках?
KDecker

3
Ви спробували пропозицію Мутанта? Чи є у вас "розумні лапки" (зігнутий і / або кутовий вид) десь у файлі?
Джон Y

2
Одним із прикладів, які можуть спричинити це, є EN DASH ( - \xe2\x80\x93)
Мартін Тома

Відповіді:


145

У вас бродячий байт плаває навколо. Ви можете знайти його, запустивши

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

де слід замінити "x.py"ім’я вашої програми. Ви побачите номер рядка та рядки-порушники. Наприклад, вставивши цей байт довільно, я отримав:

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

2
Спасибі це дуже допомогло! Досі не впевнений, що таке / було. Я закінчив кидати код у блокнот і зберігати як ASCII, а потім вставляти.
KDecker

Я також зіткнувся з цим, що, на мою думку, було пов’язано з проблемою вставлення копії, де персонаж з'явився як пробіл у редакторі (vim).
Samveen

Може знадобитися, щоб пітон знав, що такі символи існують з причини, а не просто збиті байти. Дивіться рішення у відповіді Кріса Редфорда.
simpleharsh

7
У мене була така ж проблема, характер \ xe2 був частиною дефісу "-" (\ xe2 \ x80 \ x93), але трохи довше, ніж ascii "-". Це тому, що я вставив текст у формат vim, але не звертав уваги на цей довший дефіс. Для повного оповідання я створив цього персонажа з подвійним дефісом "-" у тексті вікі (використовуючи текстиль)
PlasmaBinturong

1
Шахта була в апостроф - як вO'Donnell
user2490003

278

Якщо ви просто намагаєтесь використовувати символи UTF-8 або вам все одно, чи є вони у вашому коді, додайте цей рядок у верхню частину .pyфайлу

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

1
для мене це не працює. нижче помилка відображається завжди. SyntaxError: символ "\ xe2", який не є ASCII у файлі /home/aslam/projects/deva_26nov/mylibrary/email_constants.py у рядку 393, але кодування не оголошено; см python.org/peps/pep-0263.html подробиці
Аслам Хан

2
Чи є причина, що це не обрана відповідь?
cph

@cph Я написав це через 4 місяці після того, як було задано питання :)
Кріс Редфорд

@cph тому, що, хоча це дуже корисно, обрана відповідь відповідає на питання "який персонаж відсутній у наборі ANSI ASCII?" І те, і інше, є гарними відповідями, і перший, як правило, виграє в такому випадку.
Артур Дент

39

Або ви могли просто використовувати:

# coding: utf-8

вгорі файлу .py


27

\ xe2 - символ '-', він з’являється в деякій копії та вставленні, він використовує інший рівний вигляд '-', що викликає помилки кодування. Замініть "-" (із вставки для копіювання) правильним "-" (від вас кнопка клавіатури).


3
дуже дякую ! у моєму випадку це персонаж "" "
пієта


10

У мене була така ж помилка під час копіювання та вставлення коментаря з Інтернету

Для мене це була єдина цитата (') у слові

Я просто стер її і повторно набрав.


У мене була така ж помилка, але під час тестування локально вона не зламалася і працювала. Але при запуску на сервері він дав цю помилку кодування. Довелося замінити коментарі єдиною цитатою на версію utf-8.
шивгре

8

Додавання # кодування = utf-8 рядок у перший рядок вашого .py-файлу вирішить проблему.

Детальніше про проблему та її виправлення читайте нижче за посиланням, у цій статті проблема та її рішення чудово описані: https://www.python.org/dev/peps/pep-0263/


4

Я отримав цю помилку щодо персонажів у своїх коментарях (від копіювання / вставки вмісту з Інтернету в мій редактор для цілей запису).

Щоб вирішити в Text Wrangler:

  1. Виділіть текст
  2. Перейдіть у меню Текст
  3. Виберіть "Перетворити в ASCII"

2
Варіант змінено на text-> zap gremlins, в пізніших версіях TextWrangler, але він працював для мене :-)
TheMethod

4

На основі PEP 0263 - Визначення кодування вихідного коду 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> :

але це працювало від першого коментаря до питання, відповідь містить пояснення. спасибі
WebComer

3

У мене був такий самий випуск, і я просто додав це до верхньої частини мого файлу (у Python 3 у мене не було проблеми, але в Python 2

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

2

Приблизно через півгодини перегляду переповнення стека, мені зрозуміло, що якщо використання однієї цитати в коментарі буде через помилку:

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

Переглянувши прослідку, я зміг знайти єдину цитату, використану в моєму коментарі.


2

Якщо це комусь допомагає, для мене це сталося тому, що я намагався запустити реалізацію Django в python 3.4 за допомогою моєї команди python 2.7


Не використовував Django, але це все-таки мені допомогло. Я написав сценарій за допомогою python 3 і спробував запустити його з python 2. Помилка усунулася, коли я запустив його з потрібною версією. Дякую!
JustBlossom

1

У мене була така точна проблема із запуском простого .py-коду нижче:

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

Код DSM, наведений вище:

1 'print \ xe2 \ x80 \ x98version є \ xe2 \ x80 \ x99, sys.version'

Отже, проблема полягала в тому, що мій текстовий редактор використовував SMART QUOTES, як запропонував Джон Y. Після зміни налаштувань текстового редактора та повторного відкриття / збереження файлу він працює чудово.


1

Я намагаюся проаналізувати цей дивний віконний апостраф і після спроби кількох речей тут є фрагмент коду, який працює.

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)

0

У мене був такий самий випуск, але це було тому, що я скопіював і вставив рядок як є. Пізніше, коли я вручну вводив рядок, оскільки помилка зникла.

У мене виникла помилка через -знак. Коли я замінив його ручним введенням, -помилка була вирішена.

Скопійований рядок 10 + 3 * 5/(16 − 4)

Рядок набраний вручну 10 + 3 * 5/(16 - 4)

ви чітко бачите, що між двома дефісами є трохи різниці .

Я думаю, це через різний формат, який використовується різною ОС або, можливо, просто інше програмне забезпечення.


0

Для мене проблема виникла через "" "цього символу в лапках. Коли я скопіював код з файлу PDF, він спричинив цю помилку. Я щойно замінив "" "цим" "".


0

Якщо ви хочете помітити, який символ викликав це, просто призначте проблематичну змінну рядку та надрукуйте її на консолі iPython.

У моєму випадку

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!

0

для мене ця проблема була викликана введенням мого коду в Mac Notes, а потім скопійовано його з Mac Notes і вставлено у мій сеанс vim, щоб створити мій файл. Це зробило мої єдині цитати вигнутого типу. щоб виправити це, я відкрив свій файл у vim та замінив усі свої вигнуті одиночні лапки прямим видом, просто видаливши та переробивши того самого символу. Саме Мак Ноти зробили той самий ключовий штрих, щоб створити вигнуту єдину цитату.


0

Я довго не зміг знайти проблему, але пізніше зрозумів, що скопіював з Інтернету рядок "UTC-12: 00", і дефіс / тире в цьому спричинив проблему. Я щойно написав це "-" і знову проблема була вирішена.

Так, іноді вставлені рядки для копіювання також дають помилки. У таких випадках просто перепишіть скопійований вставлений код і він працює. Після повторного написання виглядає, що нічого не змінилося, але помилка не буде.


-1

Коли у мене є аналогічна проблема під час читання текстових файлів, я використовую ...

f = open('file','rt', errors='ignore')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.