📊 阅读时长:16分钟 | 关键词:Pandas、read_csv、to_csv、read_excel、to_excel、文件读写
引言
数据不会凭空存在。学完了 Series、DataFrame、groupby 这些核心操作后,你必须能把数据"读进来"和"写出去"------从 CSV/Excel 文件中加载数据开始分析,分析完成后把结果保存下来交给别人。这篇就是 Pandas 的"最后一公里"。
一、CSV 文件读取(read_csv)
CSV(逗号分隔值)是最通用的数据交换格式,pd.read_csv() 是它的入口。
1.1 基础用法
python
import pandas as pd
# 最简用法:直接读取
df = pd.read_csv('./test01.csv')
print(df)
1.2 分隔符参数 sep
python
# 默认分隔符是逗号,如果文件用分号分隔,需要指定
df = pd.read_csv('./test02.csv', sep=';')
print(df)
1.3 表头参数 header
python
# header 默认推断,第一行作为列索引(表头)
# 如果不想用第一行当表头,设为 None
df = pd.read_csv('./test03.csv', sep=';', header=None)
print(df)
# header=2 指定第 3 行作为表头(从 0 开始数)
df = pd.read_csv('./test03.csv', sep=';', header=2)
print(df)
1.4 自定义列名 names
python
# 用 names 参数指定列名,此时 header 自动推断为 None
df = pd.read_csv('./test02.csv', sep=';', names=['name', 'age', 'height'])
print(df)
1.5 读取大文件片段
python
# nrows 只读取前 N 行(header 先推断,再读取)
df = pd.read_csv('./test01.csv', nrows=2)
print(df)
1.6 跳过行 skiprows
python
# skiprows 为整数时,跳过前 N 行
df = pd.read_csv('./test01.csv', skiprows=2)
print(df)
# skiprows 为列表时,跳过指定索引行(0 开始)
df = pd.read_csv('./test01.csv', skiprows=[0, 2])
print(df)
1.7 指定列 usecols
python
# 只读取第 1 列和第 3 列(索引从 0 开始)
df = pd.read_csv('./test01.csv', usecols=[0, 2])
print(df)
1.8 分块读取 chunksize
大文件一次读不完?分块迭代:
python
# chunksize 指定每次读取的行数,返回 TextFileReader 迭代器
obj = pd.read_csv('./test01.csv', chunksize=2)
for chunk in obj:
print(chunk)
read_csv 参数速查:
| 参数 | 说明 | 示例 |
|---|---|---|
sep |
分隔符,默认逗号 | sep=';' |
header |
表头行号(None = 无表头) | header=0 / header=None |
names |
自定义列名列表 | names=['A','B','C'] |
nrows |
只读取前 N 行 | nrows=100 |
skiprows |
跳过指定行 | skiprows=2 / skiprows=[0,2] |
usecols |
只读取指定列 | usecols=[0, 2] |
chunksize |
分块读取行数 | chunksize=1000 |
二、CSV 文件写入(to_csv)
python
d = {
'名字': ['张三', '李四', '王五', '赵六', '孙七'],
'年龄': [18, 19, 20, 22, 17],
'身高': [188, 178, 189, 175, 177]
}
df = pd.DataFrame(data=d)
print(df)
名字 年龄 身高
0 张三 18 188
1 李四 19 178
2 王五 20 189
3 赵六 22 175
4 孙七 17 177
python
# 最简写入(默认逗号分隔,写入行索引和列索引)
df.to_csv('./test04.csv')
# 自定义分隔符
df.to_csv('./test05.csv', sep=';')
# 不写入行索引
df.to_csv('./test06.csv', index=False)
# 不写入列索引(表头)
df.to_csv('./test07.csv', header=False)
to_csv 参数速查:
| 参数 | 说明 | 默认值 |
|---|---|---|
sep |
分隔符 | ',' |
index |
是否写入行索引 | True |
header |
是否写入列索引(表头) | True |
三、Excel 文件写入(to_excel)
3.1 基础写入
python
# 写入单个工作表
df.to_excel('./test08.xlsx')
# 不写入行索引
df.to_excel('./test09.xlsx', index=False)
# 不写入列索引(表头)
df.to_excel('./test10.xlsx', header=False)
3.2 写入多个工作表
python
# 方法一:用 ExcelWriter(记得 close)
writer = pd.ExcelWriter('./test11.xlsx')
df.to_excel(writer, sheet_name='工作表1', index=False)
df.iloc[:, :2].to_excel(writer, sheet_name='工作表2', index=False) # 只写前两列
writer.close()
# 方法二:with 语句更优雅(推荐)
with pd.ExcelWriter('./test11.xlsx') as writer:
df.to_excel(writer, sheet_name='工作表1', index=False)
df.iloc[:, :2].to_excel(writer, sheet_name='工作表2', index=False)
四、Excel 文件读取(read_excel)
4.1 基础与表头
python
# header 默认为 0,第一行作为表头
df = pd.read_excel('./test11.xlsx')
print(df)
# header=None,不用第一行当表头
df = pd.read_excel('./test11.xlsx', header=None)
print(df)
# header=2,第 3 行当表头
df = pd.read_excel('./test11.xlsx', header=2)
print(df)
4.2 自定义列名
python
# 指定 names 会覆盖原有表头(header 默认 0 时)
df = pd.read_excel('./test11.xlsx', names=['name', 'age', 'height'])
print(df)
# header=None + names:第一行仍当数据
df = pd.read_excel('./test11.xlsx', header=None, names=['name', 'age', 'height'])
print(df)
4.3 选择工作表 sheet_name
python
# 整数索引(默认 0 读第一个工作表)
df = pd.read_excel('./test11.xlsx', sheet_name=1)
print(df)
# 字符串名称
df = pd.read_excel('./test11.xlsx', sheet_name='工作表2')
print(df)
# 读取多个工作表:返回 dict,key 是工作表名
df = pd.read_excel('./test11.xlsx', sheet_name=[0, '工作表2'])
print(df)
4.4 读取大文件片段
python
df = pd.read_excel('./test11.xlsx', nrows=2)
print(df)
df = pd.read_excel('./test11.xlsx', skiprows=2)
print(df)
df = pd.read_excel('./test11.xlsx', skiprows=[0, 2])
print(df)
df = pd.read_excel('./test11.xlsx', usecols=[0, 2])
print(df)
read_excel 参数速查:
| 参数 | 说明 | 示例 |
|---|---|---|
header |
表头行号 | header=0(默认)/ header=None |
names |
自定义列名 | names=['A','B'] |
sheet_name |
工作表索引或名称 | sheet_name=0 / sheet_name='Sheet1' / sheet_name=[0, 'Sheet2'] |
nrows |
只读取前 N 行 | nrows=100 |
skiprows |
跳过指定行 | skiprows=2 |
usecols |
只读取指定列 | usecols=[0, 2] |
五、CSV vs Excel:何时用哪个?
| CSV | Excel | |
|---|---|---|
| 文件大小 | 更小 | 更大 |
| 读取速度 | 更快 | 较慢 |
| 多工作表 | ❌ 不支持 | ✅ 支持 |
| 人类可读 | 纯文本,记事本可看 | 需 Office/WPS |
| 通用性 | 几乎所有工具都支持 | 主要 Office 系列 |
| 推荐场景 | 数据交换、大数据、API 导出 | 报告、多 sheet 结构化文件 |
💡 经验法则:数据分析流程中首选 CSV (轻量快速),最终交付给非技术人员时用 Excel(带格式多 sheet 好看)。
小结
| 操作 | 读 | 写 |
|---|---|---|
| CSV | pd.read_csv(file, sep=',') |
df.to_csv(file, index=False) |
| Excel | pd.read_excel(file, sheet_name=0) |
df.to_excel(writer, sheet_name='xxx') |
文件读写是数据分析的"入口"和"出口"。入口把数据加载为 DataFrame,出口把分析结果保存交付。至此,Pandas 六大模块全部完成。
本文是「Python从入门到数据分析」系列的第 18 篇。Pandas 系列完结 🎉 下一站:Matplotlib 数据可视化。
📚 Pandas 系列回顾 :
(一)Series 与 DataFrame 详解 → (二)数据清洗与缺失值处理 → (三)拼接合并与索引操作 → (四)数据统计与排序 → (五)分组聚合与函数应用 → (六)CSV 与 Excel 文件读写