Python技术迷

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())  # 先看前五行

老规矩,先看看数据格式再动手,别一来就乱搞。

假设你的表长这样:

ProductID
Name
Date
Sales
1001
手机A
2024-01-01
120
1002
手机B
2024-01-01
80
1001
手机A
2024-01-02
130

第二步,来个函数,给我传个产品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 全部免费领