含阿拉伯语的Pandas DataFrame导出Excel报AttributeError如何解决
错误原因
- 核心报错触发点:
pandas.DataFrame.to_excel()方法指定本地文件路径作为参数时,会直接将文件写入磁盘,返回值为None。你将返回的None赋值给excel变量后调用encode()方法,直接触发'NoneType' object has no attribute 'encode'报错。 - 代码语法错误:构造DataFrame的字典结构中,所有阿拉伯语字段的末尾都多了多余的英文双引号
",代码本身无法通过语法校验。 - 逻辑调用错误:
pd.read_excel()是用于读取本地Excel文件的方法,接收参数为文件路径、类文件对象,你传入已经构造完成的DataFrame对象data,属于方法调用逻辑完全错误。
修复方案
修复前请先安装xlsx格式依赖库:pip install openpyxl
场景1:需要先将Excel保存到本地磁盘,再转base64
import pandas as pd import base64 # 修正DataFrame构造语法,去掉多余的双引号 data = pd.DataFrame({ "SourceNo": [11192, 11193, 11194], "IssuedDate": ['3/15/2021', '3/15/2021', '3/15/2021'], "نوع": ["هاتف", "تلفاز", "سماعة"], "مكان الحدث": ["حي السلم", "منطقة الشمال", "ميناء"], "التاريخ": ["3/15/2021", "3/15/2021", "3/15/2021"], "أشخاص": ["مواطنون", "مواطنون", "مجهول"] }) # 去掉错误的pd.read_excel调用,直接使用构造好的data save_path = r"F:\update2.xlsx" data.to_excel(save_path, index=False, header=True, engine='openpyxl') # 读取本地Excel文件的二进制内容转base64 with open(save_path, 'rb') as f: b64 = base64.b64encode(f.read()).decode("utf-8")
场景2:Streamlit下载场景(推荐,无需写入本地磁盘,直接在内存生成Excel)
更适合Streamlit前端下载需求,避免磁盘IO开销:
import pandas as pd import base64 from io import BytesIO import streamlit as st # 构造DataFrame代码同上 data = pd.DataFrame({ "SourceNo": [11192, 11193, 11194], "IssuedDate": ['3/15/2021', '3/15/2021', '3/15/2021'], "نوع": ["هاتف", "تلفاز", "سماعة"], "مكان الحدث": ["حي السلم", "منطقة الشمال", "ميناء"], "التاريخ": ["3/15/2021", "3/15/2021", "3/15/2021"], "أشخاص": ["مواطنون", "مواطنون", "مجهول"] }) # 内存中生成Excel二进制内容 output = BytesIO() data.to_excel(output, index=False, header=True, engine='openpyxl') output.seek(0) b64 = base64.b64encode(output.read()).decode("utf-8") # Streamlit下载按钮示例 href = f'<a href="data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,{b64}" download="update2.xlsx">下载Excel文件</a>' st.markdown(href, unsafe_allow_html=True)
内容的提问来源于stack exchange,提问作者DevLeb2022
相关产品推荐
相关产品推荐

