如何将爬取的ODS数据存入内存后使用pandas-ods-reader读取
解决方案
可以通过内存缓冲区的方式实现无需落地本地磁盘的ODS读取,具体实现如下:
前置依赖
需先安装网络请求库requests:
pip install requests
实现代码
import requests from io import BytesIO from pandas_ods_reader import read_ods url = 'https://www.opendatani.gov.uk/dataset/be060ba2-19b1-426c-9736-94897e290bb4/resource/968cbade-736d-4d89-ae82-e54e68c31ea6/download/2019-northern-ireland-traffic-count-data.ods' # 发起请求获取文件二进制内容 resp = requests.get(url) # 检查请求是否正常,异常会直接抛出错误,避免解析错误内容 resp.raise_for_status() # 将二进制内容封装为类文件对象,直接传入read_ods读取 data_range = read_ods(BytesIO(resp.content))
原理解释
pandas的read_excel内置了远程URL自动处理逻辑,会自动下载文件内容并封装为可读取对象,因此可以直接传入URL参数pandas-ods-reader仅支持本地文件路径或类文件对象作为入参,直接传入URL字符串时,会将其识别为本地文件路径,找不到对应后缀的本地文件就会抛出Unknown filetype错误- 上述方案通过
BytesIO将二进制文件内容封装为符合Python IO协议的类文件对象,pandas-ods-reader可以直接读取该对象的内容,效果和读取本地文件完全一致
补充说明
如果需要读取ODS文件中的指定工作表,可以在read_ods中传入sheet参数,参数值支持工作表序号(从1开始计数)或工作表名称:
# 读取第2个工作表 data_range = read_ods(BytesIO(resp.content), sheet=2) # 读取名为traffic_data的工作表 data_range = read_ods(BytesIO(resp.content), sheet="traffic_data")
内容的提问来源于stack exchange,提问作者Kimchi
相关产品推荐
相关产品推荐

