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

如何在Jupyter Notebook中通过字节数据读取.ods文件?

解决Jupyter Notebook中通过字节数据读取.ods文件的问题

可以通过字节数据读取.ods文件,你的代码存在几个关键问题导致报错或空DataFrame,以下是修正后的完整实现:

必要依赖安装

首先确保安装处理.ods文件的相关依赖:

pip install pandas pandas_ods_reader ipywidgets

修正后的代码

import pandas as pd
from pandas_ods_reader import read_ods
from io import BytesIO
import ipywidgets as widgets
from IPython.display import display

# 创建文件上传组件
uploader = widgets.FileUpload(
    accept='.xlsx,.ods',  
    multiple=True
)
display(uploader)

# 处理上传的文件
dfs = []  # 用列表存储多个文件的DataFrame及对应文件名
for file_name in uploader.value:
    uploaded_file = uploader.value[file_name]
    bytes_data = uploaded_file['content'].tobytes()
    data_stream = BytesIO(bytes_data)
    
    try:
        # 尝试读取xlsx文件
        df = pd.read_excel(data_stream)
        dfs.append((file_name, df))
    except:
        # 读取ods前重置流指针到开头
        data_stream.seek(0)
        df = read_ods(data_stream)
        dfs.append((file_name, df))

# 查看所有读取结果
for name, df in dfs:
    print(f"===== 文件 {name} 内容 =====")
    display(df)

关键修改说明

  • 循环逻辑修正:原代码循环中始终取uploader.value[0],只会处理第一个上传文件,改为遍历每个文件名对应的数据
  • 流对象传递:pd.read_excel和read_ods都需要接收BytesIO流对象,而非直接传入字节数据
  • 流位置重置:捕获异常后读取.ods前,调用data_stream.seek(0)将流指针重置到开头,避免因读取xlsx时指针移动导致读取失败
  • 结果存储优化:用列表存储每个文件的DataFrame和文件名,方便后续逐个查看内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:45:02