Что означает знак процента в коде и как решить ‘ascii’ codec can’t decode byte 0xd1 in position 0: ordinal not in range(128) ? — Python

372 просмотра
0
0 Комментариев

msgid = '<%s.%s.%s%s@%s>' % (utcdate, pid, randint, idstring, domain)

В C:\Python27\lib\site-packages\django\core\mail\message.py на строчке 67, на нее ругается джанго при попытке отправить письмо.

Из отладчика вижу значения параметров:

> utcdate
'20170902152117'
pid
6472
randint
39104
idstring
u''
domain
<django.core.mail.utils.CachedDnsName object at 0x027CCEB0>

Но вообще, т.к. я в джанго новичок, то мне непонятно <%s.%s.%s%s@%s> и может кто подскажет роль значка процента в этом выражении.

Ошибка выскакивает такая:

‘ascii’ codec can’t decode byte 0xd1 in position 0: ordinal not in range(128)


Добавить комментарий

2 Answers

Python Опубликовано 09.12.2018
0

Данный код выполняет форматирование строки.

Форматирование строки позволяет выполнять подстановку в строку различных значений.
Для этого используется оператор %. Пример:

>>>name = 'Ivan'
>>>greeting = 'Hello, %s' % name
>>>greeting
'Hello, Ivan'

Слева от оператора % указывается строка, в которую будем подставлять значения, а справа — объект (либо кортеж, содержащий объекты), которые будут подставляться. Значения подставляются, замещая спецификатор %s.

В Вашем примере спецификаторов %s несколько. В этом случае справа указывается кортеж из элементов, которые необходимо подставить.
Пример:

>>>first_name = 'Ivan'
>>>second_name = 'Petrov'
>>>greeting = 'Hello, %s %s' % (first_name, second_name)
>>>greeting
'Hello, Ivan Petrov'

Спецификтор %s пожалуй самый распространенный. Он говорит, что на его место будет подставлена строка. Существуют и другие спецификаторы, например %d, который служит для подстановки целых чисел.

Добавить комментарий
0

PS: Ошибка выскакивает такая: ‘ascii’ codec can’t decode byte 0xd1 in position 0: ordinal not in range(128)

Основная причина ошибки заключается в том, что кодировка по умолчанию, предполагаемая python — ASCII. Следовательно, если строковые данные, которые должны быть закодированы с помощью encode (‘utf8’), содержат символ, который находится вне диапазона ASCII, например. для строки типа «hgvcj 터 파크 387», python будет вызывать ошибку, потому что строка не находится в ожидаемом формате кодирования.

Если вы используете версию python раньше версии 3.5, надежным решением было бы установить кодировку по умолчанию, принятую python, на utf8.

Добавьте эти строчки в начало кода:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up