一、核心 I/O 函数概览
Pandas 提供了丰富的函数来读取和写入各种数据格式。除了常用的 CSV 和 Excel,还支持 SQL 数据库、HTML 表格、Parquet 等格式。
| 读取函数 | 写入函数 | 支持格式 | 典型场景 |
|---|---|---|---|
pd.read_csv() |
to_csv() |
CSV、TSV | 日志文件、表格数据 |
pd.read_excel() |
to_excel() |
Excel(.xlsx, .xls) | 业务报表、财务数据 |
pd.read_sql() |
to_sql() |
SQL 数据库 | 企业数据库交互 |
pd.read_html() |
--- | HTML 表格 | 网页数据抓取 |
pd.read_parquet() |
to_parquet() |
Apache Parquet | 大数据分析、存储 |
pd.read_feather() |
to_feather() |
Feather 格式 | 快速读写、内存数据 |
pd.read_json() |
to_json() |
JSON | API 数据、Web 服务 |
pd.read_pickle() |
to_pickle() |
Python pickle | 序列化 Python 对象 |
不同格式有不同的适用场景。CSV 是通用格式但文件较大;Parquet 是列式存储,适合大数据分析;Excel 适合人工查看但不适合大数据量。
二、CSV 与文本文件
CSV(Comma-Separated Values)是最通用的数据交换格式,Pandas 对它的支持也最完善。
1. 常见读取参数
python
import pandas as pd # 最基本的读取 df = pd.read_csv("data.csv") # 指定分隔符(CSV 默认是逗号,TSV 是制表符) df_tsv = pd.read_csv("data.tsv", sep="\t") # 指定编码(处理中文文件常用) df_utf8 = pd.read_csv("data.csv", encoding="utf-8") df_gbk = pd.read_csv("data.csv", encoding="gbk") # 跳过行 df = pd.read_csv("data.csv", skiprows=3) # 跳过前 3 行 df = pd.read_csv("data.csv", skiprows=[2, 4]) # 跳过第 2、4 行 # 使用表头行(默认第一行) df = pd.read_csv("data.csv", header=0) # 第 0 行作为表头 df = pd.read_csv("data.csv", header=None) # 不使用表头,自动生成 0,1,2... # 指定列名 df = pd.read_csv("data.csv", names=["ID", "姓名", "年龄", "城市"]) # 指定索引列 df = pd.read_csv("data.csv", index_col=0) # 第 0 列作为索引 df = pd.read_csv("data.csv", index_col=["姓名"]) # 多列作为复合索引
常用参数速查:
| 参数 | 作用 | 示例 |
|---|---|---|
sep |
分隔符 | sep="\t" |
encoding |
编码 | encoding="gbk" |
header |
表头行 | header=None |
names |
自定义列名 | names=["A","B"] |
index_col |
索引列 | index_col=0 |
skiprows |
跳过行 | skiprows=3 |
nrows |
只读前 n 行 | nrows=100 |
usecols |
只读指定列 | usecols=["A","B"] |
chunksize |
分块大小 | chunksize=10000 |
2. 处理缺失值
python
import pandas as pd import numpy as np # 指定哪些值被视为缺失值 df = pd.read_csv( "data.csv", na_values=["NA", "null", "NULL", "N/A", "", " "] # 这些值都会被识别为 NaN ) # 不同的列可以用不同的缺失值标记 df = pd.read_csv( "data.csv", na_values={ "年龄": ["未知", "0"], # "年龄"列的缺失值 "城市": ["未知"] # "城市"列的缺失值 } ) # 保留某些值作为正常值(不被识别为缺失值) df = pd.read_csv("data.csv", keep_default_na=False)
3. 写入 CSV 文件
python
import pandas as pd # 准备测试数据 df = pd.DataFrame({ "姓名": ["张三", "李四", "王五"], "年龄": [25, 30, 28], "城市": ["北京", "上海", "广州"] }) # 写入 CSV(默认有索引) df.to_csv("output.csv") # 不写入索引 df.to_csv("output.csv", index=False) # 指定分隔符 df.to_csv("output.csv", sep="\t") # 不写入表头 df.to_csv("output.csv", header=False) # 指定编码(带 BOM,适合 Excel 打开) df.to_csv("output.csv", encoding="utf-8-sig")
中文乱码技巧: 用 Excel 打开 CSV 时,使用
encoding="utf-8-sig"可避免中文乱码。
三、JSON 文件
JSON(JavaScript Object Notation)是 Web 应用中最常见的数据格式,Pandas 提供了灵活的读写功能。
1. JSON 结构与读取方式
JSON 数据结构有多种形式,读取时需要根据实际结构选择合适的参数:
python
import pandas as pd import json # 准备测试 JSON 数据 data_records = ''' [ {"name": "张三", "age": 25, "city": "北京"}, {"name": "李四", "age": 30, "city": "上海"}, {"name": "王五", "age": 28, "city": "广州"} ] ''' # 方式1:JSON 数组(每行一个对象)-> DataFrame df = pd.read_json(data_records, orient="records") print(df) # 方式2:JSON 对象(键值对)-> Series data_dict = '{"name": "张三", "age": 25, "city": "北京"}' s = pd.read_json(data_dict, typ="series") print(s)
orient 参数说明:
| orient 值 | JSON 结构 | 返回类型 |
|---|---|---|
'records' |
对象数组 | DataFrame |
'index' |
索引为键的字典 | DataFrame |
'columns' |
列为键的字典 | DataFrame |
'values' |
二维数组 | DataFrame |
'split' |
包含 index/columns/data | DataFrame |
2. JSON Lines 格式
JSON Lines(.jsonl)是每行一个完整 JSON 对象的格式,常用于日志和大数据场景:
python
import pandas as pd # JSON Lines 格式数据 jsonl_data = '''{"name": "张三", "age": 25} {"name": "李四", "age": 30} {"name": "王五", "age": 28} {"name": "赵六", "age": 35} ''' # 写入 JSON Lines 文件 with open("data.jsonl", "w", encoding="utf-8") as f: f.write(jsonl_data) # 读取 JSON Lines(每行是一个 JSON 对象) df = pd.read_json("data.jsonl", lines=True) print(df)
关键参数:
lines=True表示按行解析,适用于.jsonl格式。
3. 写入 JSON
python
import pandas as pd df = pd.DataFrame({ "姓名": ["张三", "李四", "王五"], "年龄": [25, 30, 28], "城市": ["北京", "上海", "广州"] }) # 写入不同 orient 的 JSON df.to_json("output_records.json", orient="records", force_ascii=False, indent=2) df.to_json("output_index.json", orient="index", force_ascii=False, indent=2) df.to_json("output_columns.json", orient="columns", force_ascii=False, indent=2) # JSON Lines 格式 df.to_json("output.jsonl", orient="records", lines=True, force_ascii=False)
写入参数说明:
| 参数 | 作用 |
|---|---|
orient |
JSON 结构 |
force_ascii=False |
保留中文,不转义为 Unicode |
indent=2 |
格式化缩进,便于阅读 |
lines=True |
输出 JSON Lines 格式 |
四、Pickle 序列化
Pickle 是 Python 原生的对象序列化格式,可以保存任何 Python 对象,包括 DataFrame 和复杂的嵌套结构。
python
import pandas as pd import pickle # 创建复杂结构的 DataFrame df = pd.DataFrame({ "A": range(10), "B": range(10, 20), "C": ["foo", "bar"] * 5 }) # 写入 Pickle 文件 df.to_pickle("data.pkl") # 读取 Pickle 文件 df_loaded = pd.read_pickle("data.pkl") print(df_loaded) # 压缩写入(gzip 压缩,文件更小) df.to_pickle("data.pkl.gz", compression="gzip") df_loaded = pd.read_pickle("data.pkl.gz", compression="gzip")
安全警告: Pickle 格式只能被 Python 读取,不适合跨语言数据交换。另外,从不可信来源加载 Pickle 文件存在安全风险,不要加载来源不明的 .pkl 文件。
五、性能与场景选择
不同的数据格式有不同的性能特点,选择合适的格式可以大幅提升效率:
| 格式 | 读取速度 | 写入速度 | 文件大小 | 适用场景 |
|---|---|---|---|---|
| CSV | 慢 | 中 | 大 | 通用交换格式,人工可读 |
| Parquet | 很快 | 快 | 很小 | 大数据分析、列式查询 |
| Feather | 极快 | 极快 | 大 | 内存数据快速传递 |
| Pickle | 快 | 快 | 中 | Python 对象持久化 |
| JSON | 慢 | 中 | 很大 | Web API、跨语言 |
场景选择建议:
| 场景 | 推荐格式 |
|---|---|
| 与 Excel 用户交换数据 | CSV(utf-8-sig) |
| 大数据分析、长期存储 | Parquet |
| 临时缓存、进程间传递 | Feather |
| Python 内部持久化 | Pickle |
| Web API、前后端交互 | JSON |
| 数据库交互 | SQL |
六、数据读写流程图
七、常见问题与注意事项
1. 读取大文件时内存不足
对于超大的 CSV 或 JSON 文件,可以使用 chunksize 参数分块读取,避免一次性加载到内存中。
python
# 分块读取 for chunk in pd.read_csv("big_data.csv", chunksize=10000): process(chunk)
2. 中文编码问题
处理中文文件时,确保指定正确的编码。常见编码有 utf-8、gbk、gb2312、utf-8-sig(BOM)等。
| 编码 | 适用场景 |
|---|---|
utf-8 |
通用 |
gbk |
Windows 中文文件 |
utf-8-sig |
Excel 打开不乱码 |
3. 写入后文件损坏
写入重要数据前,建议先读取验证。写入大文件时使用压缩格式可以减少磁盘 IO 并降低数据损坏风险。
4. Excel 格式限制
| 版本 | 扩展名 | 单 Sheet 最大行数 |
|---|---|---|
| Excel 2003 | .xls |
65536 |
| Excel 2007+ | .xlsx |
1048576 |
超出限制请考虑其他格式。
八、常见问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 中文乱码 | 编码不匹配 | 指定 encoding="gbk" 或 utf-8-sig |
UnicodeDecodeError |
编码错误 | 尝试 gbk、utf-8、latin1 |
| JSON 读取报错 | orient 不匹配 | 用 orient="records" 或 lines=True |
| 缺失值未识别 | na_values 未设置 |
显式指定缺失值标记 |
| 列名错位 | 表头行不正确 | 用 header 或 names 参数 |
| 内存不足 | 文件太大 | 用 chunksize 分块读取 |
| Pickle 加载失败 | 版本不兼容 | 确认 Python 与 Pandas 版本 |
九、小结
本篇你掌握了 Pandas 数据读写的核心能力:
-
I/O 概览:CSV、Excel、SQL、HTML、Parquet、Feather、JSON、Pickle 八大格式。
-
CSV 读写 :
sep、encoding、header、names、index_col、na_values等参数。 -
JSON 读写 :
orient参数控制结构,lines=True处理 JSON Lines。 -
Pickle 序列化:Python 对象持久化,支持压缩,注意安全风险。
-
性能选型:Parquet 适合大数据,Feather 极快,CSV 通用,JSON 跨语言。
-
常见问题:编码、缺失值、内存不足、Excel 行数限制。
数据读写是分析工作的起点和终点,选对格式能事半功倍。下一篇我们将学习 Pandas 数据清洗,掌握缺失值、重复值、异常值的处理方法。