如何修复 AttributeError:“列表”对象没有属性“编码”

Posted

技术标签:

【中文标题】如何修复 AttributeError:“列表”对象没有属性“编码”【英文标题】:How to fix AttributeError: 'list' object has no attribute 'encode' 【发布时间】:2019-12-30 12:15:51 【问题描述】:

我正在尝试发送带有 html 附件的邮件,其中包含来自 Pandas 数据框的表格和 Python 3.7 中的一些绘图图像。当提供的数据帧中的数据不为空并且因此有要发送的绘图图像时,我不会遇到错误。我还在列表中收集发生的错误,并将它们添加到我想与邮件一起发送的最终字符串中。

def mailMe():

    # Create the container email message.
    msg = EmailMessage()
    msg['Subject'] = 'Mail'
    msg['From'] = sender
    msg['To'] = receiver

    #style overview table
    htmlTable = (
        df.style
        .set_table_styles(styles)
        .applymap(color_negative_red)
        .set_caption('Auswertung')
        .render()
    )

    #attach 100 dpi images
    if not len(pngfiles100)==0:
        for file in pngfiles100:
            try:
                with open(r'.\\temp\\'+file, 'rb') as fp:
                    img_data = fp.read()

                msg.add_attachment(img_data, maintype='image',
                                            subtype=imghdr.what(None, img_data),
                                            filename=file)
            except:
                continue

            fp.close()        

    #Error messages
    htmlTable+='\n'+'<p style="font-family:Arial;"><b>Errors:</b></p>'
    if not len(errors)==0:
        for i in errors:
            htmlTable+='\n'+'<p style="font-family:Arial;">'+i+'</p>'


    pngFolder=r'.\\temp\\' 
    htmlTable+=""" 
    <table>
    <tbody>
    """

    i=0
    for col in df.columns:
        tempDf=pd.DataFrame(data=df[col])
        tmpHtml = (
            tempDf.style
            .set_table_styles(styles)
            .applymap(color_negative_red)
            .render()
            )
        if not len(pngfiles50)==0:
            #embed 50 dpi images in mail
            htmlTable+=u'\n'+'<tr><td>'+tmpHtml+'</td>'+'<td><img src="cid:image'+str(i+1)+'"></td></tr>'+u'\n'
            try:
                fp=open(pngFolder+pngfiles50[i],'rb')
                msgImage = MIMEImage(fp.read())
                fp.close()
                msgImage.add_header('Content-ID','<image'+str(i+1)+'>')
                msg.attach(msgImage)
            except:
                continue
            i+=1

    htmlTable+="""
    </tbody>
    </table>
    """

    # Send the email via our own SMTP server.
    with smtplib.SMTP(host) as s:
        htmlTable = MIMEText(htmlTable,"html")
        msg.attach(htmlTable)
        s.send_message(msg)

追溯:

Traceback (most recent call last):
  File "c:\Users\mmai\.vscode\extensions\ms-python.python-2019.8.30787\pythonFiles\ptvsd_launcher.py", line 43, in <module>
    main(ptvsdArgs)
  File "c:\Users\mmai\.vscode\extensions\ms-python.python-2019.8.30787\pythonFiles\lib\python\ptvsd\__main__.py", line 432, in main
    run()
  File "c:\Users\mmai\.vscode\extensions\ms-python.python-2019.8.30787\pythonFiles\lib\python\ptvsd\__main__.py", line 316, in run_file
    runpy.run_path(target, run_name='__main__')
  File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "c:\Users\mmai\Documents\Python\Mail.py", line 1043, in <module>
    OEM()
  File "c:\Users\mmai\Documents\Python\Mail.py", line 168, in __init__
    self.mailMe()
  File "c:\Users\mmai\Documents\Python\Mail.py", line 1035, in mailMe
    s.send_message(msg)
  File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\smtplib.py", line 964, in send_message
    g.flatten(msg_copy, linesep='\r\n')
  File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\email\generator.py", line 116, in flatten
    self._write(msg)
  File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\email\generator.py", line 181, in _write
    self._dispatch(msg)
  File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\email\generator.py", line 214, in _dispatch
    meth(msg)
  File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\email\generator.py", line 427, in _handle_text
    if _has_surrogates(msg._payload) and not self.policy.cte_type=='7bit':
  File "C:\Users\mmai\AppData\Local\Programs\Python\Python37-32\lib\email\utils.py", line 57, in _has_surrogates
    s.encode()
AttributeError: 'list' object has no attribute 'encode'

s.send_message(msg) 似乎有问题,但我无法理解它。发送者和接收者都是字符串而不是列表。

添加解决了 msg.add_attachment(htmlTable)

【问题讨论】:

它试图编码一个字符串对象,但你给了一个列表。 【参考方案1】:

这可能会对您有所帮助:

"".join(s).encode()  

【讨论】:

感谢您的回答。这使得AttributeError: 'list' object has no attribute 'encode'' 错误消失但现在我得到'AttributeError:'bytes' 对象没有属性'encode''`,当我让htmlTable="".join(htmlTable).encode() 这个可以通过htmlTable="".join(htmlTable).decode("utf-8").encode()解决 AttributeError: 'str' object has no attribute 'decode'。所以我真的很困惑为什么它给了我一个 AttributeError 因为它已经是一个字符串而不是一个列表。 "".join(htmlTable) 的输出是什么? 只是来自 pandas 数据框表的一个长 html 字符串,例如 table id="T_2397f478_c7f4_11e9_b8df_f4b7e2f93ce1" &gt;&lt;caption&gt;Auswertung der letzten drei Schichten&lt;/caption&gt;&lt;thead&gt; &lt;tr&gt; &lt;th class="index_name level0" &gt;Maschine&lt;/th&gt; &lt;th class="col_heading level0 col0" &gt;MA216&lt;/th&gt; &lt;th class="col_heading level0 col1" &gt;MA158&lt;/th&gt; &lt;th class="col_heading level0 col2" &gt;MA084&lt;/th&gt; &lt;th class="col_heading level0 col3" &gt;MA195&lt;/th&gt; &lt;th class="col_heading level0 col4" &gt;MA092&lt;/th&gt; &lt;th class="col_heading level0 col5" &gt;MA088&lt;/th&gt; &lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;...【参考方案2】:

如果receiver是一个列表,那么使用

for i in range(len(receiver)):
            s.sendmail(message['From'], receiver[i], message.as_string())

【讨论】:

以上是关于如何修复 AttributeError:“列表”对象没有属性“编码”的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 AttributeError:模块 'tensorflow' 没有属性 'keras'?

如何修复AttributeError:模块'numpy'没有属性'square'[关闭]

如何修复“AttributeError:模块'tensorflow'没有属性'get_default_graph'”?

如何修复 AttributeError:“系列”对象没有“查找”属性?

如何修复python2.7中的“AttributeError:'module'对象没有属性'storage'”错误

如何修复此 AttributeError:“SubRequest”对象没有属性“getfuncargvalue”?