Python+Pandas打造Excel数据API
用Python + Pandas 把 Excel 变成一个 API,面试官都看傻了那种。你听着是不是有点懵:Excel 不就表格吗,怎么就成 API 了?
别急,我一开始也觉得有点玄,但我研究了下这事还真不复杂,而且特别实用,特别适合那种“公司天天让你给人导表、合表、拆表”的苦力活,直接一键搞定,还能挂个 Flask 跑个接口,客户说“我想查下某个SKU的数据”,你就让他直接调接口,谁还不想当点小老板?
那我们就开整!
首先你得明白这个需求到底在干嘛——把原本的 Excel 静态表格变成一个“有请求就有响应”的数据接口。比方说你有个销售数据表,别人给你一个产品ID,系统自动把该产品的所有销售数据扒出来,返回给用户,甚至还能做聚合分析、趋势图什么的,这不比一个个手动找、截图强太多了?
想实现这个其实主要靠两个工具:
1)Pandas:咱都熟,数据操作的扛把子 2)Flask:轻量级Web框架,用来把你写好的Python函数挂成Web API
就这两个,足够了!
下面我一步步来搞——
第一步,读 Excel,别整复杂的:
import pandas as pd
df = pd.read_excel("sales_data.xlsx") # 支持xlsx、xls都行
print(df.head()) # 先看前五行
老规矩,先看看数据格式再动手,别一来就乱搞。
假设你的表长这样:
第二步,来个函数,给我传个产品ID,我就把这货的数据都挑出来:
defget_sales_by_product(product_id):
result = df[df['ProductID'] == product_id]
return result.to_dict(orient='records')
是不是很简单?Pandas 的筛选功能太强了,一行代码就把事干完。
第三步,上 Flask,挂接口:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/api/sales', methods=['GET'])
defsales_api():
product_id = int(request.args.get('product_id'))
result = get_sales_by_product(product_id)
return jsonify(result)
if __name__ == '__main__':
app.run(debug=True)
这段代码啥意思?简单说——你访问 /api/sales?product_id=1001,它就返回这个产品的所有数据,结构是 JSON 格式。前端随便用 axios、fetch、curl 来调,分分钟搞定一个后台接口!
我试了下,这种小项目跑起来延时基本在100ms以内,本地测试飞快,部署到线上接个nginx加个gunicorn都行,简单部署。
那你可能会问:“那 Excel 要是更新了呢?接口还靠谱吗?”
有两种方式:
1)每次接口请求前重新加载 Excel(适合不大文件) 2)配个定时任务,每5分钟自动 reload 一次 Excel(用 APScheduler 或者直接用线程 Timer)
举个例子,定时 reload:
import threading
defreload_excel():
global df
df = pd.read_excel("sales_data.xlsx")
threading.Timer(300, reload_excel).start() # 每300秒一次
reload_excel()
这样你接口返回的就是5分钟内最新的数据,也能接受吧?关键是比你天天打开Excel点复制、粘贴、筛选省心多了!
还有人问:“能不能多张表组合?”
可以的!我在项目中经常遇到那种销售数据一张表、产品信息一张表,然后要综合起来返回。你只要用 merge() 就搞定了:
product_df = pd.read_excel("products.xlsx")
sales_df = pd.read_excel("sales.xlsx")
merged_df = pd.merge(sales_df, product_df, on='ProductID', how='left')
这玩意用一次就回不去了,表格直接变数据库了有没有!
对了,有个坑我要说一下:
Excel 中文字段名容易出问题,特别是非 UTF-8 编码的 Excel 表,有些系统导出来默认是 GBK,pandas 会直接报错,处理方法如下:
df = pd.read_excel("sales.xlsx", encoding='utf-8') # 不行就试 encoding='gbk'
但实际上 read_excel 是自动推测编码的,出问题你可以先用 openpyxl 手动读读看看是不是有奇怪字符。
另一个坑:有些 Excel 文件有隐藏行、合并单元格,读取时可能结构不稳定,建议统一格式或者转成 CSV 处理。
说到 CSV,有个冷知识:在 API 服务中,CSV 的解析速度往往比 Excel 快一倍以上,尤其是你用 Flask 做服务时,响应时间会非常敏感。我之前测了下同一份 10w 行的数据:
Excel 读取耗时 1.6s CSV 读取只要 0.5s
这就很明显了。
那回到主题,Excel + Pandas + Flask = 平民 API 套件,你用得好,这一套就能搞定 80% 的业务数据查询需求!
如果你想稍微进阶点,也可以加点功能:
1)接口分页(防止数据太多一次卡爆前端) 2)加入日期过滤(按时间段查数据) 3)聚合统计(比如这个产品月销量是多少)
代码简单:
df['Date'] = pd.to_datetime(df['Date'])
df_monthly = df.groupby(pd.Grouper(key='Date', freq='M')).sum()
是不是一点都不难?
-END-
我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领