Python «Ошибка синтаксиса: не-ASCII-символ« \ xe2 »в файле»

179

Я пишу некоторый код Python и получаю сообщение об ошибке, как в заголовке, при поиске это связано с набором символов.

Вот строка, которая вызывает ошибку

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

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

Я также видел несколько исправлений для этой проблемы, но я не уверен, что использовать. Может ли кто-нибудь уточнить, в чем проблема (python не интерпретирует юникод, если ему об этом не сказано?), И как мне правильно разобраться?

РЕДАКТИРОВАТЬ: Вот все строки рядом с той, что ошибки

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
источник
63
добавить # кодирование: UTF-8 в верхней части файла.
Мутант
2
Там нет проблем в том, что вы разместили; посмотрите в соседних строках.
любезно
Добавил edit 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"
DSM
источник
2
Спасибо, это очень помогло! Все еще не уверен, что это за устав. Я бросил код в блокноте и сохранил как ASCII, а затем вставил.
KDecker
Я также столкнулся с этим, что, по-моему, было связано с некоторой проблемой копирования-вставки, когда персонаж отображался как пробел в редакторе (vim).
Самвин
Может потребоваться, чтобы python знал, что такие символы существуют по какой-то причине, а не просто по случайному байту. Смотрите решение в ответе Криса Редфорда.
justharsh
7
У меня была та же проблема, символ \ xe2 был частью дефиса "-" (\ xe2 \ x80 \ x93), но немного длиннее, чем ascii "-". Это потому, что я вставил текст в vim, но не обратил внимания на этот более длинный дефис. Для полной истории я создал этого персонажа с двойным дефисом "-" в вики-тексте (с использованием текстиля)
PlasmaBinturong
1
Мой был в апострофе - как вO'Donnell
user2490003
278

Если вы просто пытаетесь использовать символы UTF-8 или вам все равно, присутствуют ли они в вашем коде, добавьте эту строку в начало вашего .pyфайла.

# -*- coding: utf-8 -*-
Крис Редфорд
источник
1
для меня это не работает. ниже ошибка, показывающая всегда. SyntaxError: не-ASCII символ '\ xe2' в файле /home/aslam/projects/deva_26nov/mylibrary/email_constants.py в строке 393, но кодировка не объявлена; см. python.org/peps/pep-0263.html для подробной информации
Аслам Хан
2
Есть ли причина, по которой это не выбранный ответ?
ср
@cph Я написал это через 4 месяца после того, как вопрос был задан :)
Крис Редфорд
@cph, потому что, хотя это очень полезно, выбранный ответ отвечает на вопрос "какого символа нет в наборе ANSI ASCII?" И то и другое - хорошие ответы, и в этом случае обычно побеждает первый.
Артур Дент
39

Или вы можете просто использовать:

# coding: utf-8

в верхней части .py файла

Ysh
источник
27

\ xe2 - это символ «-», он появляется в некоторой копии и вставляется с использованием другого одинакового «-», что приводит к ошибкам кодирования. Замените «-» (из копи-пасты) на правильное «-» (от вашей кнопки клавиатуры).

Андре Лю
источник
3
большое спасибо ! в моем случае это был персонаж "'"
pietà
23

Измените кодировку символов файла,

всегда ставьте ниже строки вверху вашего кода

# -*- coding: utf-8 -*-
Дадасо Занзане
источник
10

У меня была такая же ошибка при копировании и вставке комментария из Интернета

Для меня это была единственная цитата (') в слове

Я просто стер это и перепечатал.

Халид Сокия
источник
У меня была такая же ошибка, но при локальном тестировании она не ломалась и работала. Но когда он запускался на сервере, это приводило к ошибке кодирования. Пришлось заменить комментарии одинарной кавычкой до версии utf-8.
19
8

Добавление строки # coding = 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> :
caot
источник
все же это работало от первого комментария к вопросу, ответ содержит объяснение. спасибо
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

aless80
источник
Не использовал Django, но это все равно помогло мне. Я написал скрипт с использованием Python 3 и попытался запустить его с Python 2. Ошибка исчезла, когда я запустил его с правильной версией. Спасибо!
JustBlossom
1

У меня была именно эта проблема при запуске простого кода .py ниже:

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

Код DSM выше обеспечивает следующее:

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

Таким образом, проблема заключалась в том, что мой текстовый редактор использовал SMART QUOTES, как предложил Джон Y. После изменения настроек текстового редактора и повторного открытия / сохранения файла, он работает просто отлично.

nagrom
источник
1

Я пытаюсь разобраться в этом странном апострафе Windows, и после нескольких попыток вот фрагмент кода, который работает.

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!
meowmeow
источник
0

для меня проблема была вызвана тем, что я набрал свой код в Mac Notes, а затем скопировал его из Mac Notes и вставил в мой сеанс vim для создания моего файла. Это сделало мои одинарные кавычки изогнутым шрифтом. чтобы исправить это, я открыл свой файл в vim и заменил все мои изогнутые одинарные кавычки на прямой, просто удалив и повторно напечатав один и тот же символ. Именно Mac Notes сделал один и тот же ход клавиш для создания изогнутой одинарной кавычки.

double07robinhood
источник
0

Я долго не мог найти, в чем проблема, но позже я понял, что скопировал строку «UTC-12: 00» из сети, и дефис / тире в этом вызывал проблему. Я просто написал это "-" снова, и проблема была решена.

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

Сугандха джайн
источник
-1

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

f = open('file','rt', errors='ignore')
кулачок
источник