2.2 本地文件读取
本章学习目标:
- 知道CSV、Excel、JSON三种文件分别怎么读、会遇到什么常见问题
- 理解每种文件格式的“坑”在哪里,以及如何向AI描述解决方案
- 学会用“人话”告诉AI你要做什么,让AI生成代码
- 不需要记住任何函数名或参数,只需要知道“有什么问题”和“怎么描述”
一、核心理念:你不需要记住代码
在AI Agent时代,文件读取的代码不需要你亲手写。
你需要做的是三件事:
- 知道有什么格式:CSV、Excel、JSON,每种的特点和坑
- 知道有什么参数:编码、分隔符、跳过行数、Sheet名 —— 不需要记住拼写,知道“有这个东西”就行
- 会描述需求:用自然语言告诉AI你想做什么
打个比方:你不需要知道汽车发动机怎么工作,但你需要知道“车没油了要去加油站”、“轮胎没气了要打气”。同样,你不需要记住
pd.read_csv(encoding='utf-8'),但你需要知道“中文乱码时,告诉AI换个编码”。
二、CSV文件读取
2.1 CSV在什么场景用?
| 场景 | 为什么用CSV |
|---|---|
| 从数据库导出数据做分析 | 数据库导出功能通常默认CSV格式 |
| 从Kaggle等平台下载数据集 | 竞赛数据集几乎都是CSV |
| 在团队间传递数据 | 通用格式,任何人任何工具都能打开 |
| 存储清洗后的干净数据 | 体积小、读写快、没有格式污染 |
2.2 读取CSV时可能遇到的问题
CSV看起来简单,但实际读取时经常会遇到三个“坑”:
| 问题 | 现象 | 原因 | 怎么告诉AI |
|---|---|---|---|
| 中文乱码 | 看到ä½ å¥½这样的乱码 |
文件编码和读取时用的编码不一致 | “读取这个CSV时中文乱码了,帮我换GBK编码试试” |
| 首列丢了0 | 手机号13800138000前面的0没了 |
手机号被当成数字处理了 | “把用户ID列和手机号列当成字符串读取,不要转成数字” |
| 列数对不齐 | 某一行比其他行多出几列 | 数据内容里本身就含有逗号 | “这个CSV用逗号分隔,但数据里有逗号,帮我处理一下” |
2.3 核心参数(只需要知道“有这些参数”)
| 参数名 | 它是干嘛的 | 什么时候用 | 怎么跟AI说 |
|---|---|---|---|
| encoding | 指定文件编码 | 出现中文乱码时 | “编码换成GBK / utf-8” |
| sep | 指定分隔符 | 文件不是用逗号分隔的(比如用Tab) | “这个文件用的是竖线分隔,不是逗号” |
| dtype | 指定某列的数据类型 | 手机号、用户ID不能变成数字 | “把手机号列当成字符串读” |
| nrows | 只读前N行 | 文件太大,先看一眼结构 | “先读前100行看看数据长什么样” |
| chunksize | 分块读取 | 文件太大,内存装不下 | “这个文件有2GB,帮我分块读取,每次处理1万行” |
2.4 如何向AI描述CSV读取需求(提示词模板)
| 你的需求 | 你应该这样告诉AI |
|---|---|
| 正常读取一个CSV | “帮我用Python读取这个data.csv文件,显示前5行” |
| 中文乱码 | “读取这个CSV时中文显示乱码,帮我用GBK编码重新读” |
| 手机号丢了前导0 | “读取CSV时把手机号列当成字符串类型,不要转成数字” |
| 文件太大,先看看结构 | “这个CSV有500MB,先只读前1000行让我看看结构” |
| 文件太大,内存装不下 | “这个CSV有5GB,内存只有8GB,帮我分块读取,每块处理完后只保留需要的列” |
三、Excel文件读取
3.1 Excel在什么场景用?
| 场景 | 为什么用Excel |
|---|---|
| 业务部门给你的报表 | 业务人员熟悉Excel,能做简单计算和图表 |
| 包含多张Sheet的数据 | 一份Excel里可能有“用户表”、“订单表”等多个Sheet |
| 需要保留格式的报告 | 给别人看的时候,颜色字体都需要保留 |
| 数据量不大(10万行以内) | Excel能打开,操作流畅 |
3.2 读取Excel时可能遇到的问题
Excel文件比CSV复杂得多,因为它是给人看的,不是给机器读的。常见问题:
| 问题 | 现象 | 原因 | 怎么告诉AI |
|---|---|---|---|
| 多个Sheet | 不知道数据在哪个Sheet | 业务人员习惯把相关数据放不同Sheet | “读取这个Excel的第二个Sheet,Sheet名叫‘销售明细’” |
| 合并单元格 | 读取后很多格子是空的 | Excel里合并了单元格好看,但数据是不完整的 | “合并单元格帮我向下填充,空的地方填成上面的值” |
| 前几行不是数据 | 第1-3行是标题、Logo、空行 | 报表模板不是从第一行开始的 | “跳过前3行,第4行是列名” |
| 数字存成了文本 | 无法求和、计算 | 从别的系统导出时格式没转 | “把金额列转成数字类型” |
3.3 如何处理这些问题的思路
问题一:多个Sheet
Excel文件就像一本书,Sheet就像书的章节。你需要告诉AI:“我要读第几章”。
应对方式:
- 没指定:读取第一个Sheet(默认)
- 知道Sheet名:“读取Sheet名叫‘订单明细’的那个”
- 知道顺序:“读取第2个Sheet”
问题二:合并单元格
Excel里为了好看,经常会合并单元格,比如:
| 部门 | 姓名 | 销售额 |
|---|---|---|
| 销售部 | 张三 | 100 |
| ↑ | 李四 | 200 |
| ↑ | 王五 | 150 |
“↑”表示空,实际应该是“销售部”填充到下面所有行。
应对方式:告诉AI“把合并单元格向下填充,让空的地方自动填成上面非空的值”。
问题三:前几行不是数据
业务人员给的Excel经常长这样:
第1行:【公司Logo】
第2行:2024年销售报表
第3行:(空行)
第4行:部门 | 姓名 | 销售额 ← 这才是真正的列名
第5行:销售部 | 张三 | 100
应对方式:告诉AI“跳过前3行,用第4行作为列名”。
3.4 如何向AI描述Excel读取需求(提示词模板)
| 你的需求 | 你应该这样告诉AI |
|---|---|
| 正常读取 | “帮我读取这个orders.xlsx文件,显示前5行” |
| 指定Sheet | “读取Excel的第2个Sheet,Sheet名叫‘2024年数据’” |
| 有合并单元格 | “这个Excel有合并单元格,读取后帮我向下填充空值” |
| 前几行不是数据 | “跳过前2行空行和第3行说明,第4行才是真正的列名” |
| 只读某几列 | “只读Excel里的A、C、E三列,其他不要” |
| 多个Sheet一起读 | “把Excel里所有Sheet都读进来,每个Sheet存成一个DataFrame” |
四、JSON文件读取
4.1 JSON在什么场景用?
| 场景 | 为什么用JSON |
|---|---|
| 调用Web API获取数据 | 几乎所有互联网API都返回JSON格式 |
| 读取服务器日志 | 很多日志系统每行存一个JSON对象 |
| 处理嵌套/层级数据 | JSON天生支持“一对多”的嵌套结构 |
| 移动App和服务器的通信 | 轻量、易解析 |
4.2 理解“嵌套结构”——JSON最难但最重要的概念
先看CSV/Excel能表达的(平面表格):
| user_id | name | order_id | amount |
|---|---|---|---|
| 1001 | 张三 | 9001 | 199.5 |
| 1001 | 张三 | 9002 | 350.0 |
| 1002 | 李四 | 9003 | 89.0 |
注意:张三的名字重复出现了两次,因为他有两个订单。
再看JSON的表达方式(嵌套):
[
{
"user_id": 1001,
"name": "张三",
"orders": [
{"order_id": 9001, "amount": 199.5},
{"order_id": 9002, "amount": 350.0}
]
},
{
"user_id": 1002,
"name": "李四",
"orders": [
{"order_id": 9003, "amount": 89.0}
]
}
]
区别在哪里:
| 维度 | CSV/Excel | JSON |
|---|---|---|
| 结构 | 平面(行×列) | 嵌套(可以一层套一层) |
| 重复信息 | 张三的姓名重复2遍 | 张三的姓名只写1遍 |
| 表达“一对多” | 需要多行 | 用嵌套数组天然表达 |
| 机器读取友好 | ✅ | ✅ |
| 人类直接看懂 | ✅ | 嵌套多了有点费眼 |
4.3 什么时候需要“展开”嵌套结构?
JSON的嵌套结构,对于分析工具(如Excel、Python的pandas)来说是不友好的。
分析工具喜欢的是“平面表格”——就是一张方方正正的矩阵,每一行是一条记录,每一列是一个字段。
所以,当你拿到一个嵌套的JSON,想分析里面的数据时,你需要做一件事:把嵌套“展开”(Flatten)成平面表格。
展开前(嵌套):
用户A → 订单1、订单2、订单3
用户B → 订单4
用户C → 订单5、订单6
展开后(平面):
用户A | 订单1
用户A | 订单2
用户A | 订单3
用户B | 订单4
用户C | 订单5
用户C | 订单6
一句话理解:展开就是把“一个用户有多个订单”拆成“一行一个订单”,用户的重复信息(如姓名、城市)在每个订单行里都带上。
4.4 JSON中常见的嵌套模式
| 嵌套模式 | 长什么样 | 怎么告诉AI |
|---|---|---|
| 单层嵌套 | 用户信息外面包一层,里面是订单列表 | “把orders数组展开,每个订单变成一行,保留用户的user_id和name” |
| 多层嵌套 | 用户 → 订单 → 商品(订单里还有商品列表) | “展开到商品级别,每个商品一行,带上用户和订单的信息” |
| 元数据+数据 | {"status": "success", "data": [...]} |
“只取data里面的数组展开,status作为标记保留” |
5.5 如何向AI描述JSON读取需求(提示词模板)
| 你的需求 | 你应该这样告诉AI |
|---|---|
| 读取简单JSON(每行一个对象) | “读取这个data.json文件,它每行是一个JSON对象” |
| 展开嵌套的订单数据 | “这个JSON里每个用户有多个订单,帮我展开成平面表格,每个订单一行,用户信息重复带上” |
| API返回的数据 | “调用这个API返回了JSON,取出data字段里的数组,把它转成表格” |
| 多层嵌套 | “JSON里用户→订单→商品有三层嵌套,帮我展开到商品级别,每个商品一行” |
| 只取部分字段 | “读取这个JSON,只保留user_id、name、和orders里的amount字段” |
五、实战:三种文件的“向AI描述”对照表
| 你的场景 | 文件类型 | 你告诉AI的话 |
|---|---|---|
| 从Kaggle下载的数据 | CSV | “读取这个CSV,显示前10行看看有什么字段” |
| CSV打开是乱码 | CSV | “中文乱码了,用GBK编码重新读” |
| 业务给的月度报表 | Excel | “读取这个Excel,它有合并单元格,帮我向下填充” |
| Excel有多张Sheet | Excel | “读取这个Excel的Sheet2,Sheet名叫‘客户明细’” |
| 调用天气API | JSON | “调用天气API返回的JSON,把它转成表格” |
| 用户画像API | JSON(嵌套) | “JSON里每个用户有多个标签,帮我展开,每个标签一行” |
| 2GB的超大CSV | CSV | “文件太大内存装不下,帮我分块读取,每块1万行” |
六、本章总结
你只需要记住这三件事
| 文件类型 | 核心坑 | 怎么告诉AI |
|---|---|---|
| CSV | 中文乱码、数字前丢0、分隔符不是逗号 | “换编码”、“转成字符串”、“分隔符是竖线” |
| Excel | 多Sheet、合并单元格、前几行不是数据 | “读Sheet2”、“合并单元格向下填充”、“跳过前3行” |
| JSON | 嵌套结构、需要展开 | “JSON里有嵌套数组,帮我展开成平面表格” |
核心心法
你不需要记住
pd.read_csv(encoding='gbk', dtype={'phone': str})—— 你只需要知道“中文乱码换编码”、“手机号按文本读”。告诉AI,它会生成正确的代码。
思考题
-
从业务同事那里拿到一个CSV,打开后中文全是乱码。你怀疑是编码问题。你会怎么告诉AI?
-
一个Excel文件,打开后发现:第1-2行是公司Logo和标题,第3行是列名,从第4行开始是数据,而且A列有合并单元格。你会怎么告诉AI去读取?
-
调用一个电商API,返回的JSON结构是:外层有
status和data,data里面是一个数组,每个元素是一个订单,每个订单里有order_id和products(商品列表)。你想分析每个商品的情况。你会怎么告诉AI? -
一个CSV文件有2GB,你的电脑只有8GB内存。直接读取会内存不足。你会怎么告诉AI解决这个问题?
下一节预告:2.3 数据库读取 —— 公司的数据在MySQL里,怎么告诉AI去连接、查询、取数?
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)