做数据分析或自动化办公,绕不开的第一个环节就是读取csv文件。csv本质上是纯文本格式的表格数据,每一行代表一条记录,字段之间用逗号分隔。python处理这类文件有两条路:一是标准库自带的csv模块,无需安装任何依赖;二是第三方库pandas,功能更强大,也是数据分析的事实标准。这篇文章会把两种方法都讲透,并补充编码、大文件、缺失值这些实战中必然会遇到的细节。

用标准库csv模块读取文件
csv模块是python内置的,打开解释器就能用,适合不想引入额外依赖的场景,比如写一些轻量脚本或者部署环境受限的项目。它的核心对象有两个:reader用于按行读取列表,DictReader用于把每一行转成字典,字典的键就是表头。两种方式的区别在于后续取数的方式,列表按下标取,字典按键取,后者写出来的代码可读性明显更好。
import csv
# 基本读取:每行是一个列表
with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
header = next(reader) # 先读表头
for row in reader:
print(row[0], row[1])
# 用DictReader读取:每行是一个字典
with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
print(row['姓名'], row['年龄'])
这里有几个容易出错的地方需要提醒。第一,open时务必带上encoding参数,不指定的话python会使用系统默认编码,在Windows上通常是gbk,遇到utf-8编码的文件就会报UnicodeDecodeError。第二,如果文件是用制表符或其他符号分隔的,可以通过delimiter参数指定,例如csv.reader(f, delimiter='\t')。第三,with open的写法能保证文件在使用完后自动关闭,比手动调用close安全得多。
用pandas读取:read_csv参数详解
如果要做真正的数据处理,pandas几乎是必选项。安装命令为pip install pandas,装好之后用read_csv一行代码就能把文件读成DataFrame对象,后续可以方便地做筛选、聚合、统计。csv模块读进来的都是字符串,还得自己转换类型,而pandas会自动推断每列的数据类型,这一步就省了不少事。
import pandas as pd
# 最基础的用法
df = pd.read_csv('data.csv', encoding='utf-8')
# 常用参数组合
df = pd.read_csv(
'data.csv',
encoding='gbk', # 指定编码,中文乱码时优先尝试gbk
sep=',', # 分隔符,制表符文件用 sep='\t'
header=0, # 第0行作为表头,无表头文件用 header=None
names=['姓名', '年龄'], # 手动指定列名
usecols=['姓名', '年龄'],# 只读取指定列,省内存
nrows=1000 # 只读前1000行,快速预览大文件
)
print(df.head()) # 查看前5行
print(df.info()) # 查看列类型和缺失情况
print(df.describe()) # 数值列统计摘要
关于编码问题多说几句。Windows下用Excel另存出的csv通常是gbk编码,而Linux平台或数据库导出的多为utf-8。如果不确定文件编码,可以先用chardet库检测:chardet.detect(open('data.csv','rb').read())['encoding'],检测出结果后再传给read_csv的encoding参数,这个方法能解决绝大多数乱码问题。
表头处理也是高频需求。有些csv第一行不是表头而是数据,此时设header=None并配合names参数手动起列名;有些文件表头有冗余空格,可以加skipinitialspace=True。另外index_col参数可以把某一列设为行索引,parse_dates参数能把日期字符串直接解析成时间类型,这两个参数在时间序列分析里特别常用。
大文件分块读取与数据清洗
当csv文件大到几个GB时,一次性读入内存会导致程序直接崩掉。pandas提供了chunksize参数来分块读取,每次只加载固定行数进内存,处理完一块再读下一块。这种模式特别适合统计类任务,比如累加求和、计数,或者从海量数据里筛出符合条件的少量记录。
import pandas as pd
# 分块读取,每次读10万行
chunk_iter = pd.read_csv('big_data.csv', chunksize=100000)
total = 0
result_list = []
for chunk in chunk_iter:
# 每一块都做相同的过滤逻辑
filtered = chunk[chunk['销售额'] > 1000]
result_list.append(filtered)
total += chunk['销售额'].sum()
# 合并所有符合条件的记录
final_df = pd.concat(result_list, ignore_index=True)
print('销售总额:', total)
print('符合条件记录数:', len(final_df))
读取只是第一步,实际数据往往并不干净。缺失值是最常见的问题,pandas里用df.isnull().sum()可以快速查看每列缺失数量。处理方式看业务需求:数值列可以用fillna(0)填充默认值,也可以用均值填充df['列名'].fillna(df['列名'].mean());如果缺失比例太高,干脆用dropna把整行丢掉。重复数据则用drop_duplicates()处理。
还有一个细节值得注意:如果某列混合了数字和文本,pandas会把整列推断为object类型(即字符串),此时可以用pd.to_numeric(df['列名'], errors='coerce')强制转换,无法转换的值会变成NaN而不是抛异常,这样代码更健壮。掌握读取、清洗这两步,python数据处理的入门就算真正完成了,后面的分析和可视化都建立在这个基础之上。
python读取csvcsv文件处理pandas数据处理修改时间:2026-09-03 11:31:28