数据读写 #

数据格式概览 #

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