如何在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
相关产品推荐
相关产品推荐

