读 Excel / CSV:一行代码打开报表
《不是一条狗》第 06 篇,pandas 核心篇开篇。入门篇练完基本功,从这篇起,正式把 Excel 的活一个个搬进代码。一切的第一步:把数据读进来
不管你想合并、对账、还是做透视,第一步永远是同一个动作——把表读进来。
在 Excel 里这一步是“双击打开”;在 Python 里,是一行代码。读进来之后,这张表就变成了一个叫 df 的东西(DataFrame,你就理解成“代码里的那张表”),后面所有操作都围着它转。
为什么不直接在 Excel 里干?因为一旦读进了代码,这张表就能被“自动处理”——同样的清洗、汇总、合并,写一次,以后几十张表一键重跑。这一篇就把“读进来 + 看清它”这件事彻底讲明白,它是后面每一篇的地基。
读 Excel:一行就够
import pandas as pddf = pd.read_excel("销售明细.xlsx")
如果一个 Excel 里有多个工作表(sheet),read_excel 默认只读第一个。要读指定的那个,用 sheet_name:
df = pd.read_excel("销售明细.xlsx", sheet_name="5月") # 按名字df = pd.read_excel("销售明细.xlsx", sheet_name=1) # 或按序号(从 0 数,1 是第二个)
想一次把所有 sheet 都读进来?传 sheet_name=None,会得到一个字典,键是 sheet 名、值是对应的表:所有表 = pd.read_excel("销售明细.xlsx", sheet_name=None)print(所有表.keys()) # 看有哪些 sheetdf_5月 = 所有表["5月"] # 按名字取其中一张
这招在“一个文件里十二个月份分了十二个 sheet”时特别好用。读进来之后,先“体检”4 下
刚读进来别急着干活,先用 4 个动作看清它长啥样——这是老手的习惯,能帮你少踩一半的坑:
print(df.head()) # ① 看前 5 行,确认读对了print(df.shape) # ② 形状:(行数, 列数)print(df.columns) # ③ 所有列名,后面要按列名取数df.info() # ④ 每列什么类型、有没有缺失值
head():瞄一眼前 5 行,确认表头、数据没读错位。想看更多行就 head(20),想看最后几行用 tail()。shape:比如 (5000, 8) 就是 5000 行 8 列,心里有数。
columns:列名清单。后面所有 df["金额"] 都得用这里的真实列名,建议直接复制,别手打。
info():看每列是数字还是文本、哪列有空值——这是清洗前必看的一步。
还有一个加分项 describe(),一行给出每个数字列的总数、均值、最大最小、分位数,扫一眼就知道数据大概什么量级、有没有离谱的异常值:
只读你要的那几列
表有几十列,但你这次只关心两三列?用 usecols 直接挑,读进来更清爽也更快:
df = pd.read_excel("销售明细.xlsx", usecols=["客户", "金额"])
读 CSV:多一个“编码”要注意
CSV 用 read_csv,几乎一样:
df = pd.read_csv("销售明细.csv")
但财务从系统、银行导出的 CSV,十有八九是 GBK 编码,直接读会报错或中文乱码。遇到就加一个参数:df = pd.read_csv("销售明细.csv", encoding="gbk")
口诀:CSV 中文乱码 / 报 UnicodeDecodeError → 先加 encoding="gbk" 再试,还不行换 encoding="utf-8-sig"。分隔符不是逗号(有的导出用制表符或分号),用 sep 指定,比如 pd.read_csv("x.csv", sep="\t")。
数字被当成文本(前面带很多 0 的编号、卡号),加 dtype={"卡号": str} 让它保持文本,免得 0 被吃掉。
表头不在第一行怎么办
很多报表第一行是大标题、第二行才是真表头。read_excel 默认拿第一行当列名,这时就读歪了。用 header 指定真表头在第几行(从 0 数):
df = pd.read_excel("报表.xlsx", header=2) # 表头在第 3 行
或者用 skiprows=2 直接跳过前两行,效果类似。⚠️ 避坑
FileNotFoundError:文件没找到。检查文件名、后缀,以及它是否和脚本在同一个文件夹(路径问题占新手报错的一半)。
CSV 中文全是乱码 / UnicodeDecodeError:加 encoding="gbk",多数从系统/银行导出的文件都是它。
读进来只有一列、整行挤在一起:CSV 的分隔符不对,用 sep 指定真正的分隔符。
数字编号开头的 0 没了(如“001”变成 1):读的时候用 dtype={"列名": str} 把它当文本读。
表头是乱的(Unnamed: 0 之类):多半是表头行没对上,用 header= 指定真表头所在行。
小作业
- 用 read_excel 读一张你手头的真实报表,跑一遍 head()、shape、columns、info()、describe(),把这张表彻底“看清楚”。
- 如果文件里有多个 sheet,试试用 sheet_name= 读其中指定的一张。
- 如果你有从系统导出的 CSV,试试加 encoding="gbk" 读进来。
📌 完整代码 + 示例数据怎么拿?
本篇的代码和一份脱敏示例数据(Excel + GBK 的 CSV)都已开源。
关注公众号「不是一条狗」,回复关键词 github地址,即可获取完整代码仓库链接。
下一篇
《筛选、排序、求和:Excel 操作的代码版》——表读进来了,下一篇开始真正“动”它,把你最熟的筛选、排序、求和换成代码写法。
公众号:不是一条狗|跟着做,把最烦的活一个个干掉。