Python FastAPI实战
在平时的数据分析工作中我们经常会遇到这样的场景拿到了一份脏乱的 CSV 数据比如薪资明细需要清洗规范后输出成一份规范的PDF文档在提交给相关人员。那能不能把处理逻辑封装起来别人只需要在网页上点一点上传文件就能直接下载报告所以用FastAPI在本地电脑上搭建了一个“数据清洗与报告生成微服务”全程不需要购买云服务器1..技术栈选择Web 框架FastAPI数据处理PandasDataWrangling.py里用的核心库报告生成Matplotlib 的PdfPages运行环境本地 Windows/Mac 电脑 断网都能跑2.项目结构设计project/├── main.py # FastAPI 主入口负责接收请求和返回响应├── DataWrangling.py # 核心业务逻辑清洗数据、生成PDF└── Data.csv # 用于测试的原始数据3.核心逻辑与代码实现3.1业务逻辑层部分代码实现def clean_csv(file_bytes: bytes) - dict: 接口1用返回JSON df pd.read_csv(io.BytesIO(file_bytes)) df _do_clean(df) result (df.groupby(standard_title)[salary] .mean() .sort_values(ascendingFalse)) report {k: round(v, 2) for k, v in result.items()} detail df[[raw_title, clean_title, standard_title, salary]].to_dict(records) return {total_rows: len(df), report: report, detail: detail} def generate_pdf(file_bytes: bytes) - bytes: 接口2用清洗数据 → 画图 → 返回PDF字节流 不写本地文件全部在内存中完成 # 清洗数据 df pd.read_csv(io.BytesIO(file_bytes)) df _do_clean(df) result (df.groupby(standard_title)[salary] .mean() .sort_values(ascendingFalse)) # 中文字体 sys_name platform.system() if sys_name Windows: plt.rcParams[font.sans-serif] [SimHei] else: plt.rcParams[font.sans-serif] [Arial Unicode MS] plt.rcParams[axes.unicode_minus] False # 在内存中生成PDF pdf_buffer io.BytesIO() # 内存中的文件 with PdfPages(pdf_buffer) as pdf: # ---------- 第1页柱状图 ---------- fig, ax plt.subplots(figsize(10, 6)) bars ax.bar(result.index, result.values, color#4C72B0, edgecolorwhite, width0.6) for bar, val in zip(bars, result.values): ax.text(bar.get_x() bar.get_width() / 2, bar.get_height() 300, f¥{int(val)}, hacenter, vabottom, fontsize11, fontweightbold) ax.set_title(各标准岗位平均薪资对比, fontsize16, fontweightbold, pad15) ax.set_ylabel(平均薪资元, fontsize12) ax.set_xlabel(标准岗位, fontsize12) ax.set_ylim(0, result.max() * 1.15) plt.xticks(rotation30, haright) plt.tight_layout() pdf.savefig(fig) plt.close(fig) # ---------- 第2页饼图 ---------- fig2, ax2 plt.subplots(figsize(8, 8)) ax2.pie(result.values, labelsresult.index, autopct%1.1f%%, colorsplt.cm.Set3.colors[:len(result)], startangle90) ax2.set_title(各岗位薪资占比分布, fontsize16, fontweightbold, pad15) plt.tight_layout() pdf.savefig(fig2) plt.close(fig2) # 把内存里的PDF转成字节流返回 pdf_bytes pdf_buffer.getvalue() pdf_buffer.close() return pdf_bytes3.2接口层import io from fastapi import FastAPI, UploadFile, File, HTTPException from fastapi.responses import StreamingResponse from fastapi.middleware.cors import CORSMiddleware from DataWrangling import clean_csv, generate_pdf from DataWrangling import RULES app FastAPI(title薪资数据清洗服务, version1.0) app.add_middleware( CORSMiddleware, allow_origins[*], allow_methods[*], allow_headers[*], ) app.post(/api/clean) async def clean_data(file: UploadFile File(...)): 上传CSV返回清洗后的JSON数据 if not file.filename.endswith(.csv): raise HTTPException(status_code400, detail只支持 .csv 文件) file_bytes await file.read() try: result clean_csv(file_bytes) except Exception as e: raise HTTPException(status_code422, detailf清洗失败: {str(e)}) return {status: success, data: result} app.post(/api/report) async def download_report(file: UploadFile File(...)): 上传CSV → 清洗数据 → 生成PDF → 存到本地 返回给浏览器下载 if not file.filename.endswith(.csv): raise HTTPException(status_code400, detail只支持 .csv 文件) file_bytes await file.read() try: # 1. 调用你的函数生成 PDF 字节流 pdf_bytes generate_pdf(file_bytes) # 【排错关键】打印一下生成的数据类型和长度看看对不对 print(f 生成结果类型: {type(pdf_bytes)}, 长度: {len(pdf_bytes) if pdf_bytes else 0}) except Exception as e: # 如果这里报错了会在黑框框里打印完整的错误原因而不是被浏览器吞掉 print(f❌ 生成PDF彻底失败错误详情: {e}) import traceback traceback.print_exc() # 打印详细报错栈 raise HTTPException(status_code422, detailf生成PDF失败: {str(e)}) # 返回给浏览器不管浏览器能不能下本地肯定有了 return StreamingResponse( io.BytesIO(pdf_bytes), media_typeapplication/pdf, headers{Content-Disposition: attachment; filenamesalary_report.pdf} ) app.get(/api/rules) async def get_rules(): 查看当前的岗位映射规则 return {status: success, rules: RULES} app.get(/api/health) async def health(): return {status: ok, message: 服务运行中}这里有个问题就是电脑可能会遇到IDM出错你可以尝试按Alt快捷键如果无效你可以尝试Ctrl快捷键或者其他不过也没有关系可以加个直接写在本地pdf文件的功能或者自己在浏览器下载pdf文档# 新增强制写入本地文件夹 local_filename 本地生成的测试报告.pdf try: with open(local_filename, wb) as f: f.write(pdf_bytes) print(f✅ 成功保存到本地文件{local_filename}) except Exception as e: print(f⚠️ 保存本地文件失败: {e}) # # 返回给浏览器不管浏览器能不能下本地肯定有了 return StreamingResponse( io.BytesIO(pdf_bytes), media_typeapplication/pdf, headers{Content-Disposition: attachment; filenamesalary_report.pdf} )启动main.py文档程序运行会有个网页点击report提交需要清洗数据的文档提交后会有输出的文档以上。

相关新闻

【SAP CO】4.COPC产品成本控制-5.生产成本月结

【SAP CO】4.COPC产品成本控制-5.生产成本月结

目录 一、生产类成本费用归集 二、配置作业分割 【OKES】定义分割结构 【OKEW】将分割结构分配至成本中心 三、计算实际作业单价 【KSS2】作业分割 【KSII】计算实际作业单价 【KBK7】查看实际价格 四、【MFN1/CON2】单个/所有订单重估 五、计算overhead 六、计算WI…

2026/10/13 2:28:29 阅读更多 →
AI日报从0到600期:信息筛选与判断力训练实战

AI日报从0到600期:信息筛选与判断力训练实战

1. 一份AI日报的诞生逻辑:从信息洪流到每日必读每天早上八点半,我的工作台上会准时出现一份文档。它不是别人发来的,是我自己给自己写的——一份叫“AI日报”的东西。到今天,这个习惯已经坚持了快两年,累计输出了超过六…

2026/10/13 2:27:29 阅读更多 →
OSG+osgEarth+Qt预编译环境配置指南:MSVC2017实现快速三维开发

OSG+osgEarth+Qt预编译环境配置指南:MSVC2017实现快速三维开发

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 2:27:29 阅读更多 →

最新新闻

PS5通用调校指南:从HDR发灰、下载慢到手柄断连的排查与优化

PS5通用调校指南:从HDR发灰、下载慢到手柄断连的排查与优化

最近一位朋友新入手了PS5,连着问了我好几个问题:电视开HDR之后画面发灰,下载一个游戏等了一夜还没好,手柄玩到一半断连,重连又要重新匹配。我一边远程指导一边发现,这些疑难杂症其实跟“哪一台PS5”没什么关…

2026/10/13 3:19:47 阅读更多 →
接口自动化测试实战:Excel用例管理+unittest+xlrd+xlsxwriter

接口自动化测试实战:Excel用例管理+unittest+xlrd+xlsxwriter

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 3:19:47 阅读更多 →
AnyPS5实战:基于官方链路的PS5游戏串流全攻略

AnyPS5实战:基于官方链路的PS5游戏串流全攻略

如果你家里的 PS5 只能老老实实待在客厅电视下面,那这台机器一大半的潜力其实都没被用上。AnyPS5 是我这段时间集中折腾的一个项目,思路特别直接:把 PS5 的画面和操作,通过游戏串流的方式,送到你手边任何一块屏幕上——…

2026/10/13 3:19:47 阅读更多 →
PMI参数的解读与应用分析

PMI参数的解读与应用分析

PMI是宏观经济的重要指标,这里尝试对PMI参数进行解读和分析。 1 定义与特征 1.1 定义 采购经理指数(PMI)通过对企业采购经理的月度问卷调查结果统计汇总、编制而成的指数, 涵盖企业采购、生产、流通等各个环节,包括制造业和非制造业领域&…

2026/10/13 3:19:47 阅读更多 →
Simulink风光储并网系统建模与协调控制策略详解

Simulink风光储并网系统建模与协调控制策略详解

1. 项目概述与整体系统方案选择风电和光伏是当前电力系统中发展最快的两类清洁能源,但两者的出力特性完全不同——风电随风速波动,光伏则受辐照度和温度制约,两者叠加后仍然存在天然间歇性。储能系统的加入就是用来弥补这种波动,把…

2026/10/13 3:19:47 阅读更多 →
小白程序员必备:收藏!从零开始掌握 Codex 大模型核心技术

小白程序员必备:收藏!从零开始掌握 Codex 大模型核心技术

本文深入解析 Codex 大模型的六层架构,涵盖模型、Runtime、Context、Tool、Sandbox 和 Environment 的功能与关系。通过分析 Agent Loop 的工作原理,揭示 Token 的计量方式以及 Context Window 与 Memory 的关联。文章还探讨了长任务中出现的“忘记”现象…

2026/10/13 3:18:47 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →