github star gitee star atomgit star PyPI Downloads AI 编程 AI 交流群

大家好,我是正在实战各种AI项目的程序员晚枫。

今天学习Pandas的数据读写功能

在实际工作中,数据可能来自各种地方:Excel表格、CSV文件、数据库、API接口。掌握数据的导入导出,是数据分析的第一步。


读取CSV文件

CSV是最常见的数据格式,纯文本,兼容性好。

基础读取

1
2
3
4
5
6
7
import pandas as pd

# 读取CSV
df = pd.read_csv('data.csv')

# 查看前几行
print(df.head())

常用参数

1
2
3
4
5
6
7
8
9
10
df = pd.read_csv('data.csv',
encoding='utf-8', # 编码格式
sep=',', # 分隔符(默认逗号)
header=0, # 第几行作为列名
index_col=0, # 哪列作为索引
usecols=['A', 'B', 'C'], # 只读取指定列
nrows=1000, # 只读前1000行
skiprows=2, # 跳过前2行
na_values=['NA', 'NULL', '-'] # 识别为缺失值的字符串
)

中文编码问题

1
2
3
4
# 如果中文乱码,尝试不同编码
df = pd.read_csv('data.csv', encoding='gbk') # 国标编码
df = pd.read_csv('data.csv', encoding='utf-8-sig') # 带BOM的UTF-8
df = pd.read_csv('data.csv', encoding='latin1') # 西欧编码

读取Excel文件

安装依赖

1
pip install openpyxl xlrd

基础读取

1
2
3
4
5
6
7
8
9
10
# 读取第一个sheet
df = pd.read_excel('data.xlsx')

# 读取指定sheet
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
df = pd.read_excel('data.xlsx', sheet_name=0) # 按索引

# 读取多个sheet
all_sheets = pd.read_excel('data.xlsx', sheet_name=None)
# 返回字典:{'Sheet1': df1, 'Sheet2': df2}

常用参数

1
2
3
4
5
6
7
8
9
df = pd.read_excel('data.xlsx',
sheet_name='销售数据',
header=0, # 列名所在行
skiprows=1, # 跳过开头几行
nrows=100, # 读取行数
usecols='A:C', # 读取A到C列
usecols=[0, 1, 2], # 按索引选列
dtype={'列名': str} # 指定列的数据类型
)

保存数据

保存为CSV

1
2
3
4
5
6
7
8
9
10
11
12
# 基础保存
df.to_csv('output.csv', index=False) # index=False不保存行索引

# 完整参数
df.to_csv('output.csv',
index=False, # 不保存索引
encoding='utf-8-sig', # 带BOM,Excel打开不乱码
sep=',', # 分隔符
float_format='%.2f', # 浮点数格式
columns=['A', 'B'], # 只保存指定列
mode='w' # 写入模式('a'追加)
)

保存为Excel

1
2
3
4
5
6
7
8
# 基础保存
df.to_excel('output.xlsx', index=False)

# 保存多个sheet
with pd.ExcelWriter('output.xlsx') as writer:
df1.to_excel(writer, sheet_name='Sheet1', index=False)
df2.to_excel(writer, sheet_name='Sheet2', index=False)
df3.to_excel(writer, sheet_name='Sheet3', index=False)

读取其他格式

JSON

1
2
3
4
5
6
7
8
# 读取JSON
df = pd.read_json('data.json')

# 从字符串读取
import json
with open('data.json', 'r') as f:
data = json.load(f)
df = pd.json_normalize(data) # 展平嵌套JSON

SQL数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
from sqlalchemy import create_engine

# 创建连接
engine = create_engine('mysql+pymysql://user:password@host:port/database')

# 读取SQL
df = pd.read_sql('SELECT * FROM table_name', engine)
df = pd.read_sql_table('table_name', engine)
df = pd.read_sql_query('SELECT * FROM table WHERE age > 18', engine)

# 写入SQL
df.to_sql('new_table', engine, if_exists='replace', index=False)
# if_exists: 'fail'(默认), 'replace', 'append'

大数据分块读取

1
2
3
4
5
6
# 当文件太大,内存不够时
chunks = pd.read_csv('big_file.csv', chunksize=10000)

for chunk in chunks:
# 处理每个chunk
process(chunk)

实战:批量处理Excel报表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import pandas as pd
import glob

# 合并多个Excel文件
all_files = glob.glob("sales/*.xlsx")

all_data = []
for file in all_files:
# 读取每个文件
df = pd.read_excel(file)
# 添加文件名作为来源标识
df['来源文件'] = file
all_data.append(df)

# 合并所有数据
combined = pd.concat(all_data, ignore_index=True)

# 统计每月销售额
monthly_sales = combined.groupby('月份')['销售额'].sum()

# 保存结果
with pd.ExcelWriter('汇总报告.xlsx') as writer:
combined.to_excel(writer, sheet_name='原始数据', index=False)
monthly_sales.to_excel(writer, sheet_name='月度汇总')

print(f"处理了{len(all_files)}个文件,共{len(combined)}条记录")

性能对比:不同读取方式的速度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import pandas as pd
import numpy as np
import time

# 先创建一个10万行的测试文件
df = pd.DataFrame({
'id': range(100000),
'value': np.random.randn(100000),
'category': np.random.choice(['A', 'B', 'C'], 100000),
'date': pd.date_range('2024-01-01', periods=100000, freq='5min')
})
df.to_csv('test.csv', index=False)
df.to_parquet('test.parquet', index=False)
df.to_feather('test.feather', index=False)

# CSV读取
start = time.time()
df_csv = pd.read_csv('test.csv')
print(f"CSV: {time.time()-start:.3f}秒")

# Parquet读取
start = time.time()
df_par = pd.read_parquet('test.parquet')
print(f"Parquet: {time.time()-start:.3f}秒")

# Feather读取
start = time.time()
df_fea = pd.read_feather('test.feather')
print(f"Feather: {time.time()-start:.3f}秒")

# 典型结果:CSV 0.8秒 vs Parquet 0.05秒 vs Feather 0.01秒
格式读取速度文件大小适用场景
CSV通用交换格式
Excel很慢很大给老板看
Parquet大数据存储
Feather最快临时中间文件
JSONAPI数据

进阶用法

大文件分块读取

1
2
3
4
5
6
7
8
9
10
11
# 100万行CSV,内存不够怎么办?分块读取!
chunk_size = 50000
results = []

for chunk in pd.read_csv('huge_file.csv', chunksize=chunk_size):
# 每次只读5万行
processed = chunk.groupby('category')['value'].sum()
results.append(processed)

# 合并结果
final = pd.concat(results).groupby(level=0).sum()

读取数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from sqlalchemy import create_engine

# 连接MySQL
engine = create_engine('mysql+pymysql://user:password@localhost:3306/mydb')

# 读取整个表
df = pd.read_sql('SELECT * FROM users', engine)

# 读取查询结果
df = pd.read_sql('''
SELECT city, COUNT(*) as cnt, AVG(age) as avg_age
FROM users
WHERE register_date > '2025-01-01'
GROUP BY city
''', engine)

# 写入数据库
df.to_sql('analysis_result', engine, if_exists='replace', index=False)

读取网页表格

1
2
3
4
5
# 一行代码读取网页上的表格
url = 'https://en.wikipedia.org/wiki/List_of_countries_by_GDP_(nominal)'
tables = pd.read_html(url)
gdp_df = tables[2] # 第3个表格
print(gdp_df.head())

避坑指南

❌ 坑1:CSV中文乱码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 读取含中文的CSV
df = pd.read_csv('data.csv', encoding='utf-8') # 默认utf-8

# 如果乱码,试试这些编码
df = pd.read_csv('data.csv', encoding='gbk') # Windows中文
df = pd.read_csv('data.csv', encoding='gb2312') # 简体中文
df = pd.read_csv('data.csv', encoding='gb18030') # 最全的中文编码

# 自动检测编码
import chardet
with open('data.csv', 'rb') as f:
result = chardet.detect(f.read())
print(f"检测到编码: {result['encoding']}")
df = pd.read_csv('data.csv', encoding=result['encoding'])

❌ 坑2:Excel日期解析错误

1
2
3
4
5
6
7
8
# Excel日期经常被解析成数字
df = pd.read_excel('data.xlsx')

# 如果日期列变成了数字(Excel内部用天数表示日期)
df['date'] = pd.to_datetime('1899-12-30') + pd.to_timedelta(df['date'], unit='D')

# 更好的方式:指定日期列
df = pd.read_excel('data.xlsx', parse_dates=['order_date', 'ship_date'])

❌ 坑3:读取时列名有空格

1
2
3
4
5
6
7
# CSV列名有空格:"User Name", "Order Date"
df = pd.read_csv('data.csv')
print(df.columns) # 列名带空格,用起来很麻烦

# 清理列名
df.columns = df.columns.str.strip().str.lower().str.replace(' ', '_')
print(df.columns) # ['user_name', 'order_date'],好用多了

实战案例:从多个数据源整合电商数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import pandas as pd
import numpy as np

# 1. 读取订单数据(CSV)
orders = pd.read_csv('orders.csv', parse_dates=['order_date'])

# 2. 读取用户数据(Excel)
users = pd.read_excel('users.xlsx', sheet_name='活跃用户')

# 3. 读取商品数据(JSON)
products = pd.read_json('products.json')

# 4. 从数据库读取库存数据
from sqlalchemy import create_engine
engine = create_engine('sqlite:///inventory.db')
inventory = pd.read_sql('SELECT * FROM stock', engine)

# 5. 合并数据
# 先合并订单和用户
df = orders.merge(users, on='user_id', how='left')
# 再合并商品信息
df = df.merge(products[['product_id', 'category', 'price']], on='product_id', how='left')

# 6. 导出为多种格式
df.to_csv('integrated_data.csv', index=False, encoding='utf-8-sig') # Windows友好
df.to_parquet('integrated_data.parquet', index=False) # 高效存储
df.to_excel('report.xlsx', sheet_name='整合数据', index=False) # 给老板看

print(f"整合完成!共{len(df)}条记录,{len(df.columns)}个字段")

下节预告

下一课我们将学习数据筛选与查询,这是数据分析的核心技能。

👉 继续阅读:数据筛选与查询


💬 加入学习交流群

扫码加入Python学习交流群,和数千名同学一起进步:

👉 点击加入交流群

群里不定期分享:

  • 数据分析实战案例
  • Python学习资料
  • 求职面试经验
  • 行业最新动态

推荐:AI Python数据分析实战营

🎁 限时福利:送《利用Python进行数据分析》实体书

👉 点击了解详情


课程导航

上一篇: Pandas入门-Series和DataFrame

下一篇: 数据筛选与查询


PS:数据的导入导出是分析的第一步。熟练掌握这些操作,能帮你节省大量时间。



📚 推荐教材

主教材《Excel+Python 飞速搞定数据分析与处理(图灵出品)》

💬 联系我

平台账号/链接
微信扫码加好友
微博@程序员晚枫
知乎@程序员晚枫
抖音@程序员晚枫
小红书@程序员晚枫
B 站Python 自动化办公社区

主营业务:AI 编程培训、企业内训、技术咨询

🎓 AI 编程实战课程

想系统学习 AI 编程?程序员晚枫的 AI 编程实战课 帮你从零上手!