Как исправить ошибку Python "" кодек ascii не может декодировать байт 0xc2 в позиции 364: порядковый номер не в диапазоне (128) " - PullRequest
0 голосов
/ 11 октября 2019

У меня есть почтовик, использующий python, и во время работы почтовой программы я получаю

error "Traceback (most recent call last):
  File "C:\Users\Education\Documents\DDonnelly\Python\Email\2019_CCS_Renewal\main.py", line 11, in <module>
    mailer()
  File "C:\Users\Education\Documents\DDonnelly\Python\Email\2019_CCS_Renewal\ccs_renewal_mailer.py", line 35, in mailer
    plaintext_body = ccs_plaintext_message.replace('{first_name}', first_name)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 364: ordinal not in range(128)"

Я добавил комментарий "# - - coding: utf-8 - -"к началу файла, но я все еще получаю этот код. я даже изменил кодировку реестра по умолчанию на utf с помощью приведенной ниже команды в CMD, и не повезло

"REG ADD HKCU\Console\%SystemRoot^%_system32_cmd.exe /v CodePage /t REG_DWORD /d 65001"

ниже приведен фрагмент кода, на который ссылалась ошибка. Я ДЕЙСТВИТЕЛЬНО оценил бы любое руководство о том, как исправить это и заставить этот почтовик работать

КОД SNIPPET

# -*- coding: utf-8 -*-
import win32com.client as win32
from openpyxl import load_workbook
from ccs_renewal_message import ccs_html_message
from ccs_message_plaintext import ccs_plaintext_message


wb = load_workbook('ccs_renewal_list.xlsx')

Получает указанный лист Excel

sheet = wb.get_sheet_by_name('2019 Pending')

def mailer():

    for row in sheet:

        # Stores each individual's information in the variables below
        first_name = row[2].value
        last_name = row[1].value
        full_name = row[2].value + " " + row[1].value
        renewal_date_value = row[4].value
        renewal_date = renewal_date_value.strftime('%m/%d/%Y')
        email = row[3].value
        ncbfaa_id = str(row[0].value)
        # Opens outlook
        outlook = win32.Dispatch('outlook.application')
        # Gets email ready
        mail = outlook.CreateItem(0)

        mail.To = email
        mail.Subject = 'Renewal'

        #Plain Text Message
        plaintext_body = ccs_plaintext_message.replace('{first_name}', first_name)
        mail.Body = plaintext_body.replace('{renewal_date}', renewal_date)

        #HTML Message
        html_body = ccs_html_message.replace('{first_name}', first_name)
        html_body2 = html_body.replace('{id}', ncbfaa_id)
        mail.HTMLBody = html_body2.replace('{renewal_date}', renewal_date)


C:\Users\Education\Documents\DDonnelly\Python\Email\2019_CCS_Renewal>main.py
Eduardo Lozano's certificate has been created
Traceback (most recent call last):
  File "C:\Users\Education\Documents\DDonnelly\Python\Email\2019_CCS_Renewal\main.py", line 11, in <module>
    mailer()
  File "C:\Users\Education\Documents\DDonnelly\Python\Email\2019_CCS_Renewal\ccs_renewal_mailer.py", line 35, in mailer
    plaintext_body = ccs_plaintext_message.replace('{first_name}', first_name)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 364: ordinal not in range(128)

1 Ответ

0 голосов
/ 11 октября 2019
plaintext_body = ccs_plaintext_message.replace('{first_name}', first_name)

в этой строке вы используете str для преобразования из unicode в закодированный текст / байты. Вы можете решить это, либо правильно расшифровав first_name, а затем передавая на замену функцию.

plaintext_body = ccs_plaintext_message.replace('{first_name}', first_name.encode('utf-8'))

Вам также следует подумать об изменении типа ccs_plaintext_message на unicode с str. Вы можете сделать это, просто добавив u перед str. пример

ccs_plaintext_message = u'some string '
...