Как python обрабатывает код, отличный от UTF-8? Удаление части рабочего кода приводит к ошибке кодирования

#python

#python

Вопрос:

У меня Python ведет себя очень странно. Обновленный вопрос, чтобы избавиться от всего несвязанного кода:

Мой новый файл содержит только это содержимое:

 renamingDict = {'ID':'lead_id','Статус':'status','Название лида':'title','Имя':'name','Дата создания':'created_at','Источник':'source','Рабочий телефон':'phones','Ответственный':'manager','Дата изменения':'changed_at','Комментарий':'lead_comment','Дата экскурсии, ожидаемая':'exc_date','Ссылка':'link','ID брони/заявки':'res_id','ID экскурсии':'lead_exc_id','ID организатора':'lead_org_id'}
 

это выдает ошибку:

SyntaxError: Non-UTF-8 code starting with 'xd0' in file .lead_analysis.py on line 10, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

но это НЕ выдаст ошибку, если я добавлю новый элемент в источник словаря. После ‘lead_comment’ я добавлю ‘UTM Source’:», и я бы:

 renamingDict = {'ID':'lead_id','Статус':'status','Название лида':'title','Имя':'name','Дата создания':'created_at','Источник':'source','Рабочий телефон':'phones','Ответственный':'manager','Дата изменения':'changed_at','Комментарий':'lead_comment','UTM Source':'','Дата экскурсии, ожидаемая':'exc_date','Ссылка':'link','ID брони/заявки':'res_id','ID экскурсии':'lead_exc_id','ID организатора':'lead_org_id'}
 

Который отлично работает!

Я могу исправить все это, добавив

 #!/usr/bin/python
# -*- coding: UTF-8 -*-
 

в начале моего кода, но самая странная часть заключается в том, что я сталкиваюсь с ошибкой после УДАЛЕНИЯ независимой части рабочего кода.

Как python может думать, что словарь из 17 элементов в порядке, но выдает ошибку «encoding», когда я удаляю один элемент из словаря, даже не продолжая. Он понял мой код с дополнительными символами, как он может не понимать его сейчас?

Проблема кажется настолько абсурдной, что я действительно хочу, чтобы кто-нибудь помог мне понять, как это работает, хотя у меня есть обходной путь с

 #!/usr/bin/python
# -*- coding: UTF-8 -*-
 

Более того, моя «глючная» строка со словарем работает без ошибок, если я просто добавлю новую строку в список моего словаря

Комментарии:

1. encoding open Я думаю, проблема заключается в добавлении параметра в функцию

2. Пожалуйста, покажите точные первые 10 строк каждой версии кода — вы утверждаете, что там возникает ошибка, но вы не показали нам. Я бы заподозрил проблему с цитированием…

3. Вы только даете подсказки. Можете ли вы попытаться предоставить [mvce] рабочий исходный файл, а другой не работает при удалении какого-либо элемента.

4. OK here is MVCE: renamingDict = {‘ID’:’lead_id’,’Статус’:’status’,’Название лида’:’title’,’Имя’:’name’,’Дата создания’:’created_at’,’Источник’:’source’,’Рабочий телефон’:’phones’,’Ответственный’:’manager’,’Дата изменения’:’changed_at’,’Комментарий’:’lead_comment’,’Дата экскурсии, ожидаемая’:’exc_date’,’Ссылка’:’link’,’ID брони/заявки’:’res_id’,’ID экскурсии’:’lead_exc_id’,’ID организатора’:’lead_org_id’}

5. выше приведено ПОЛНОЕ СОДЕРЖИМОЕ нового файла, которое выдает ошибку. Ошибка не возникает, если мы добавим ‘UTM Source’:» после элемента [lead_comment]

Ответ №1:

Итак, вы сами нашли решение: укажите кодировку

Моя теория почему: UTF-8 использует 1 байт для одних символов и несколько для других. Таким образом, добавление нескольких символов, отличных от ascii, которые сами по себе не приводят к ошибке, может привести к тому, что анализатор не будет синхронизирован с количеством символов и, следовательно, вызовет ошибку позже.

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

Комментарии:

1. @Алексей Уверен, что мой ответ (по крайней мере, отчасти) правильный, вы его пробовали?

2. Спасибо за ответ! К сожалению, я был сосредоточен на другом подходе (вы можете увидеть в комментариях к сообщению), и текущее состояние этой проблемы ДЛЯ МЕНЯ заключается в том, как запретить моей Windows использовать Python 2 при запуске «python myFile.py » в Скорлупе…