Pyscript:如何通过HTML输入加载文件并传入Python Pandas
解决PyScript中加载Excel/ODF文件到Pandas的问题
你的核心问题是错误地将二进制Excel文件解码成了文本,这会破坏文件的二进制结构,导致pandas.ExcelFile()无法识别。Excel/ODF都是二进制格式的文件,不能用TextDecoder处理,需要直接以二进制流的形式传给Pandas。
修正后的完整代码
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" /> <script defer src="https://pyscript.net/latest/pyscript.js"></script> <title>Excel File Processor</title> <py-config type="json"> { "packages": ["pandas", "openpyxl", "odf"] } </py-config> </head> <body> <label for="file_input">选择Excel/ODF文件:</label> <!-- 限制文件类型,提升用户体验 --> <input type="file" id="file_input" name="file_input" accept=".xlsx,.xls,.ods"> <br /> <div id="print_output"></div> <br /> <p>工作表名称:</p> <div style="border:2px inset #AAA;cursor:text;height:120px;overflow:auto;width:600px; resize:both"> <div id="content"></div> </div> <py-script output="print_output"> import pandas from js import document, console from pyodide import create_proxy import io async def process_file(event): console.log('开始处理文件') fileList = event.target.files.to_py() for f in fileList: console.log('当前文件:', f.name) # 获取文件的二进制数组缓冲区 array_buffer = await f.arrayBuffer() # 转换为Python的bytes对象 file_bytes = bytes(array_buffer) # 用BytesIO包装成文件流,供Pandas读取 excel_file = pandas.ExcelFile(io.BytesIO(file_bytes)) # 获取工作表名称列表 sheet_names = excel_file.sheet_names console.log('工作表名称:', sheet_names) # 显示到页面 document.getElementById("content").innerText = "\n".join(sheet_names) console.log('文件处理结束') def main(): console.log('初始化完成') # 创建事件代理并绑定到文件选择控件 file_event = create_proxy(process_file) e = document.getElementById("file_input") e.addEventListener("change", file_event, False) main() </py-script> </body> </html>
关键修正点说明
- 补充依赖库:在
py-config中新增openpyxl(解析.xlsx)和odf(解析.ods),Pandas需要这些库来识别对应格式的文件。 - 限制文件类型:给文件选择框添加
accept=".xlsx,.xls,.ods",避免用户选择不支持的文件。 - 二进制流处理:
- 获取文件的
arrayBuffer()后直接转为Python的bytes对象,跳过错误的文本解码步骤。 - 用
io.BytesIO将bytes包装成Pandas可识别的文件流对象,传入pandas.ExcelFile()。
- 获取文件的
- 优化显示内容:将原有的乱码文本显示改为输出工作表名称,更贴合业务需求。
额外扩展提示
如果需要读取具体工作表的数据,可以在获取excel_file后添加:
df = excel_file.parse(sheet_names[0]) # 读取第一个工作表数据 console.log(df.head()) # 打印数据前5行
内容的提问来源于stack exchange,提问作者Alex44
相关产品推荐
相关产品推荐

