Pandas入门教程(六):数据读写详解——CSV、JSON、Pickle 与格式选型

一、核心 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 数据清洗,掌握缺失值、重复值、异常值的处理方法。

相关推荐
etafort4 小时前
js格式化json树结构
json
喵喵虫1 天前
汉字笔顺笔画元数据导出 JSON
小程序·json·元数据·汉字·笔顺·笔画
benchmark_cc1 天前
实时行情和分钟 K 线应该如何配合使用?从信号计算到交易决策的完整分析
大数据·python·数据分析·pandas·量化交易·股票数据·quantdash
熊猫钓鱼>_>1 天前
Kotlin Multiplatform for OpenHarmony 实战:kotlinx-serialization JSON 适配
开发语言·华为·kotlin·华为云·json·harmonyos·code
quantdash_cc2 天前
Pandas 处理分钟级股票行情:从原始数据清洗到 K 线聚合
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
烂蜻蜓2 天前
Pandas入门教程(四):Series数据结构——创建、索引与常用方法
数据结构·pandas
benchmark_cc2 天前
量化项目启动时,应该先设计数据接口还是先编写策略?从系统架构角度做出正确选择
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
雪芽蓝域zzs2 天前
json数据转化成interface属性
前端·javascript·json