You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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",避免用户选择不支持的文件。
  • 二进制流处理:
    1. 获取文件的arrayBuffer()后直接转为Python的bytes对象,跳过错误的文本解码步骤。
    2. 用io.BytesIO将bytes包装成Pandas可识别的文件流对象,传入pandas.ExcelFile()。
  • 优化显示内容:将原有的乱码文本显示改为输出工作表名称,更贴合业务需求。

额外扩展提示

如果需要读取具体工作表的数据,可以在获取excel_file后添加:

df = excel_file.parse(sheet_names[0])  # 读取第一个工作表数据
console.log(df.head())  # 打印数据前5行

内容的提问来源于stack exchange,提问作者Alex44

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:35:35