数据读写 #
数据格式概览 #
Pandas 支持多种数据格式的读写操作,满足不同的数据交换需求。
text
┌─────────────────────────────────────────────────────────────┐
│ Pandas 数据格式支持 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 文本格式 │
│ ├── CSV pd.read_csv() / df.to_csv() │
│ ├── JSON pd.read_json() / df.to_json() │
│ ├── HTML pd.read_html() / df.to_html() │
│ └── XML pd.read_xml() / df.to_xml() │
│ │
│ 二进制格式 │
│ ├── Excel pd.read_excel() / df.to_excel() │
│ ├── Parquet pd.read_parquet() / df.to_parquet() │
│ ├── Feather pd.read_feather() / df.to_feather() │
│ ├── HDF5 pd.read_hdf() / df.to_hdf() │
│ ├── Pickle pd.read_pickle() / df.to_pickle() │
│ └── ORC pd.read_orc() / df.to_orc() │
│ │
│ 数据库 │
│ ├── SQL pd.read_sql() / df.to_sql() │
│ └── SQLAlchemy 支持多种数据库 │
│ │
│ 其他 │
│ ├── Clipboard pd.read_clipboard() / df.to_clipboard() │
│ └── Stata pd.read_stata() / df.to_stata() │
│ │
└─────────────────────────────────────────────────────────────┘
CSV 文件 #
读取 CSV #
python
import pandas as pd
# 基本读取
df = pd.read_csv('data.csv')
# 指定分隔符
df = pd.read_csv('data.txt', sep='\t')
# 指定列名
df = pd.read_csv('data.csv', names=['col1', 'col2', 'col3'])
# 指定索引列
df = pd.read_csv('data.csv', index_col='id')
# 跳过行
df = pd.read_csv('data.csv', skiprows=1) # 跳过第一行
df = pd.read_csv('data.csv', skiprows=[0, 2]) # 跳过第1和第3行
# 读取指定行数
df = pd.read_csv('data.csv', nrows=100)
# 指定数据类型
df = pd.read_csv('data.csv', dtype={'col1': 'int32', 'col2': 'str'})
# 解析日期
df = pd.read_csv('data.csv', parse_dates=['date_col'])
# 处理缺失值
df = pd.read_csv('data.csv', na_values=['NA', 'N/A', 'null'])
# 编码
df = pd.read_csv('data.csv', encoding='utf-8')
df = pd.read_csv('data.csv', encoding='gbk') # 中文编码
写入 CSV #
python
# 基本写入
df.to_csv('output.csv')
# 不写入索引
df.to_csv('output.csv', index=False)
# 指定分隔符
df.to_csv('output.txt', sep='\t')
# 指定列
df.to_csv('output.csv', columns=['col1', 'col2'])
# 处理缺失值
df.to_csv('output.csv', na_rep='NULL')
# 编码
df.to_csv('output.csv', encoding='utf-8-sig') # 带 BOM
大文件处理 #
python
# 分块读取
chunks = pd.read_csv('large.csv', chunksize=10000)
for chunk in chunks:
process(chunk)
# 只读取需要的列
df = pd.read_csv('large.csv', usecols=['col1', 'col2'])
# 指定数据类型节省内存
dtypes = {'col1': 'int32', 'col2': 'category'}
df = pd.read_csv('large.csv', dtype=dtypes)
Excel 文件 #
读取 Excel #
python
# 需要安装 openpyxl
# pip install openpyxl
# 读取单个工作表
df = pd.read_excel('data.xlsx')
# 指定工作表
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
df = pd.read_excel('data.xlsx', sheet_name=0) # 索引
# 读取多个工作表
dfs = pd.read_excel('data.xlsx', sheet_name=['Sheet1', 'Sheet2'])
dfs = pd.read_excel('data.xlsx', sheet_name=None) # 所有工作表
# 指定表头位置
df = pd.read_excel('data.xlsx', header=0) # 第一行
df = pd.read_excel('data.xlsx', header=None) # 无表头
# 指定列
df = pd.read_excel('data.xlsx', usecols='A:C')
df = pd.read_excel('data.xlsx', usecols=[0, 1, 2])
df = pd.read_excel('data.xlsx', usecols=['Name', 'Age'])
# 跳过行
df = pd.read_excel('data.xlsx', skiprows=1)
写入 Excel #
python
# 基本写入
df.to_excel('output.xlsx')
# 指定工作表名
df.to_excel('output.xlsx', sheet_name='Data')
# 不写入索引
df.to_excel('output.xlsx', index=False)
# 写入多个工作表
with pd.ExcelWriter('output.xlsx') as writer:
df1.to_excel(writer, sheet_name='Sheet1')
df2.to_excel(writer, sheet_name='Sheet2')
# 追加到现有文件
with pd.ExcelWriter('output.xlsx', mode='a') as writer:
df.to_excel(writer, sheet_name='NewSheet')
# 格式化
with pd.ExcelWriter('output.xlsx', engine='xlsxwriter') as writer:
df.to_excel(writer, sheet_name='Sheet1')
workbook = writer.book
worksheet = writer.sheets['Sheet1']
format = workbook.add_format({'bold': True})
worksheet.set_column('A:A', 20, format)
JSON 文件 #
读取 JSON #
python
# 基本读取
df = pd.read_json('data.json')
# 指定格式
df = pd.read_json('data.json', orient='records')
# orient 选项:'split', 'records', 'index', 'columns', 'values', 'table'
# 从 URL 读取
df = pd.read_json('https://api.example.com/data.json')
# 从字符串读取
json_str = '{"col1": [1, 2], "col2": [3, 4]}'
df = pd.read_json(json_str)
# 复杂 JSON
import json
with open('complex.json') as f:
data = json.load(f)
df = pd.json_normalize(data) # 扁平化嵌套 JSON
写入 JSON #
python
# 基本写入
df.to_json('output.json')
# 指定格式
df.to_json('output.json', orient='records')
df.to_json('output.json', orient='index')
# 格式化输出
df.to_json('output.json', indent=2)
# 日期格式
df.to_json('output.json', date_format='iso')
# 压缩
df.to_json('output.json.gz', compression='gzip')
SQL 数据库 #
连接数据库 #
python
import pandas as pd
from sqlalchemy import create_engine
# SQLite
engine = create_engine('sqlite:///database.db')
# MySQL
engine = create_engine('mysql+pymysql://user:password@host:3306/database')
# PostgreSQL
engine = create_engine('postgresql://user:password@host:5432/database')
# SQL Server
engine = create_engine('mssql+pyodbc://user:password@server/database?driver=ODBC+Driver+17+for+SQL+Server')
读取 SQL #
python
# 使用 SQL 查询
df = pd.read_sql('SELECT * FROM users', engine)
# 使用 SQL 文件
with open('query.sql') as f:
query = f.read()
df = pd.read_sql(query, engine)
# 参数化查询
df = pd.read_sql('SELECT * FROM users WHERE age > %s', engine, params=[25])
# 读取整个表
df = pd.read_sql_table('users', engine)
# 指定列
df = pd.read_sql_table('users', engine, columns=['name', 'age'])
# 分块读取
chunks = pd.read_sql('SELECT * FROM large_table', engine, chunksize=10000)
写入 SQL #
python
# 写入表
df.to_sql('users', engine)
# 追加数据
df.to_sql('users', engine, if_exists='append')
# 替换表
df.to_sql('users', engine, if_exists='replace')
# 不写入索引
df.to_sql('users', engine, index=False)
# 指定数据类型
from sqlalchemy.types import VARCHAR, INTEGER
df.to_sql('users', engine, dtype={'name': VARCHAR(100), 'age': INTEGER})
Parquet 文件 #
Parquet 是一种高效的列式存储格式,适合大数据处理。
python
# 需要安装 pyarrow 或 fastparquet
# pip install pyarrow
# 读取 Parquet
df = pd.read_parquet('data.parquet')
# 写入 Parquet
df.to_parquet('output.parquet')
# 指定压缩
df.to_parquet('output.parquet', compression='snappy')
df.to_parquet('output.parquet', compression='gzip')
# 指定引擎
df = pd.read_parquet('data.parquet', engine='pyarrow')
# 读取指定列
df = pd.read_parquet('data.parquet', columns=['col1', 'col2'])
Feather 文件 #
Feather 是一种快速的二进制格式,适合短期存储。
python
# 需要安装 pyarrow
# pip install pyarrow
# 读取 Feather
df = pd.read_feather('data.feather')
# 写入 Feather
df.to_feather('output.feather')
HDF5 文件 #
HDF5 适合存储大型科学数据集。
python
# 需要安装 tables
# pip install tables
# 写入 HDF5
df.to_hdf('data.h5', key='df')
# 读取 HDF5
df = pd.read_hdf('data.h5', key='df')
# 追加数据
df.to_hdf('data.h5', key='df2', mode='a')
# 压缩
df.to_hdf('data.h5', key='df', complevel=9, complib='blosc')
Pickle 文件 #
Pickle 可以序列化任意 Python 对象。
python
# 写入 Pickle
df.to_pickle('data.pkl')
# 读取 Pickle
df = pd.read_pickle('data.pkl')
# 压缩
df.to_pickle('data.pkl.gz', compression='gzip')
df = pd.read_pickle('data.pkl.gz', compression='gzip')
剪贴板 #
python
# 从剪贴板读取
df = pd.read_clipboard()
# 写入剪贴板
df.to_clipboard()
其他格式 #
HTML #
python
# 读取 HTML 表格
dfs = pd.read_html('https://example.com/table.html')
dfs = pd.read_html('data.html')
# 写入 HTML
df.to_html('output.html')
# 格式化
df.to_html('output.html', index=False, border=0)
XML #
python
# 读取 XML
df = pd.read_xml('data.xml')
# 写入 XML
df.to_xml('output.xml')
Stata #
python
# 读取 Stata
df = pd.read_stata('data.dta')
# 写入 Stata
df.to_stata('output.dta')
SAS #
python
# 读取 SAS
df = pd.read_sas('data.sas7bdat')
SPSS #
python
# 读取 SPSS
df = pd.read_spss('data.sav')
性能对比 #
text
┌─────────────────────────────────────────────────────────────┐
│ 格式性能对比 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 格式 读取速度 写入速度 文件大小 兼容性 │
│ ──────── ──────── ──────── ──────── ──────── │
│ CSV 慢 慢 大 极高 │
│ Excel 慢 慢 大 高 │
│ JSON 中 中 大 高 │
│ Parquet 快 快 小 中 │
│ Feather 极快 极快 中 低 │
│ HDF5 快 快 小 中 │
│ Pickle 快 快 中 低 │
│ │
│ 建议: │
│ - 数据交换:CSV、JSON │
│ - 大数据存储:Parquet │
│ - 临时存储:Feather、Pickle │
│ - 科学计算:HDF5 │
│ │
└─────────────────────────────────────────────────────────────┘
最佳实践 #
选择合适的格式 #
python
# 数据交换 → CSV/JSON
df.to_csv('data.csv')
df.to_json('data.json')
# 大数据存储 → Parquet
df.to_parquet('data.parquet')
# 快速临时存储 → Feather
df.to_feather('data.feather')
# 带格式的报表 → Excel
df.to_excel('report.xlsx')
处理大文件 #
python
# 分块处理
for chunk in pd.read_csv('large.csv', chunksize=10000):
process(chunk)
# 只读取需要的列
df = pd.read_csv('large.csv', usecols=['col1', 'col2'])
# 指定数据类型
dtypes = {'col1': 'int32', 'col2': 'category'}
df = pd.read_csv('large.csv', dtype=dtypes)
# 使用高效格式
df.to_parquet('data.parquet') # 比 CSV 更小更快
下一步 #
掌握了数据读写后,接下来学习 数据选择,深入了解如何灵活地选择和访问数据!
最后更新:2026-04-04