Python使用pandas读取CSV文件的代码示例
详细介绍在Python中使用pandas库读取CSV文件的代码示例,涵盖基础读取、常用参数解析、编码与异常处理以及大文件分块读取技巧。
在 Python 数据分析与工程开发中,CSV(Comma-Separated Values)是存储表格数据最常用的轻量级格式。使用 pandas 库读取 CSV 文件的核心方法是 pandas.read_csv()。本文通过清晰的代码示例,说明从安装环境、编写基础读取代码,到配置常用参数、优化大文件性能以及排查编码报错的完整操作过程。
一、准备环境与最小可运行代码
在编写 Python 脚本前,需要确保运行环境中已安装 pandas。如未安装,可以在终端或命令行工具中执行以下安装命令:
pip install pandas
假设在项目目录下有一个名为 sales_data.csv 的数据文件,其文本内容如下:
order_id,product,category,amount,date
1001,Laptop,Electronics,5200.00,2026-01-15
1002,Keyboard,Electronics,299.50,2026-01-16
1003,Desk,Furniture,850.00,2026-01-17
1004,Chair,Furniture,420.00,2026-01-18
使用 pandas 读取该文件并查看其前几行数据的最小代码如下:
import pandas as pd
# 读取本地 CSV 文件
df = pd.read_csv('sales_data.csv')
# 打印前 3 行数据
print(df.head(3))
# 查看数据结构概要
print(df.info())
在上述执行过程中,pd.read_csv() 自动完成了解析表头、推断列数据类型(如将 amount 推断为浮点型)、生成行索引(RangeIndex)等步骤。整个读取与核验的标准步骤如下图所示:
二、常用参数及代码示例
真实业务场景中的 CSV 文件往往存在非逗号分隔、无表头、缺失值编码多样或日期格式需要解析等情况。pd.read_csv() 提供了丰富的参数用于精准控制读取过程。
1. 改变分隔符(sep 或 delimiter)
默认情况下,pd.read_csv() 使用逗号 , 分隔字段。如果文件是制表符分隔的 TSV 文件,或者以分号 ;、竖线 | 分隔,需要通过 sep 参数显式指定:
# 读取以分号分隔的 CSV 文件
df_semi = pd.read_csv('data_semicolon.csv', sep=';')
# 读取制表符分隔的文件(TSV)
df_tsv = pd.read_csv('data_tab.tsv', sep='\t')
# 正则分隔符:处理连续不定数量的空格
df_spaces = pd.read_csv('data_spaces.txt', sep=r'\s+', engine='python')
2. 指定或忽略表头(header 与 names)
如果 CSV 文件的第一行不是列名,直接读取会导致第一行数据被误当成表头。此时应设置 header=None,并通过 names 自定义列名:
# 数据文件第一行就是数据本身(没有列名)
df_no_header = pd.read_csv(
'raw_data.csv',
header=None,
names=['user_id', 'user_name', 'score', 'signup_date']
)
print(df_no_header.head(2))
3. 选择特定列读取(usecols)
当 CSV 包含几十列甚至上百列,而后续计算只需其中少数几列时,使用 usecols 可以显著节省内存开销并加快读取速度:
# 按列名挑选需要的列
df_subset = pd.read_csv('sales_data.csv', usecols=['order_id', 'amount'])
# 或者传入列索引位置列表(例如读取第 0 列和第 3 列)
df_subset_idx = pd.read_csv('sales_data.csv', usecols=[0, 3])
4. 强制指定数据类型(dtype)
pandas 会自动推断数据类型,但对于身份证号、工号、订单编号等包含前导零(如 "00123")的字段,自动推断为整型后前导零会丢失。通过 dtype 参数强制将这类列定义为字符串类型 str:
# 确保 order_id 保留为文本格式,防止前导零丢失或超长整数精度异常
df_typed = pd.read_csv('sales_data.csv', dtype={'order_id': str, 'amount': float})
print(df_typed.dtypes)
5. 解析日期时间(parse_dates)
CSV 纯文本中不包含日期类型,默认会被读入为 object(字符串)。若需要进行时间序列切片或按月统计,应在读取时传入 parse_dates:
# 将 'date' 列自动转换为 pandas 的 datetime64 格式
df_dated = pd.read_csv('sales_data.csv', parse_dates=['date'])
# 验证类型是否转换成功
print(df_dated['date'].dtype)
# 输出示例:datetime64[ns]
6. 处理自定义缺失值(na_values)
除了标准的空字符串或 NaN,某些系统导出的数据常使用 "NULL"、"None"、"-" 或 "-999" 代表缺失值。可以使用 na_values 将它们统一识别为缺失:
df_clean = pd.read_csv('sales_data.csv', na_values=['-', 'N/A', 'missing'])
三、常见报错与排查处理方案
在使用 pandas.read_csv() 读取不同来源的 CSV 数据时,最容易遇到的是编码错误、路径错误以及由于格式不规则导致的解析异常。下文给出每种报错的成因及可靠解决办法。
1. UnicodeDecodeError(编码错误)
报错表现:UnicodeDecodeError: 'utf-8' codec can't decode byte ... in position ...
成因:pandas 默认采用 utf-8 解码。而在 Windows 系统下由 Excel 保存或部分国内业务系统导出的 CSV,常采用 GBK、GB2312 或带 BOM 的 UTF-8-SIG。
解决方法:在调用中指定 encoding='gbk'。如果仍报错,可尝试 encoding='gb18030'(支持生僻字)或 encoding='utf-8-sig':
# 解决 GBK 编码报错
df_gbk = pd.read_csv('chinese_data.csv', encoding='gbk')
# 处理带有 UTF-8 BOM 标记的 Excel CSV
df_bom = pd.read_csv('excel_export.csv', encoding='utf-8-sig')
2. FileNotFoundError(找不到文件)
报错表现:FileNotFoundError: [Errno 2] No such file or directory: 'data.csv'
成因:使用了相对路径,但当前终端的工作目录(Current Working Directory)并不是该 Python 脚本或 CSV 文件所在的目录。
解决方法:推荐结合 pathlib.Path 或 os.path 基于当前脚本路径构建绝对路径:
from pathlib import Path
import pandas as pd
# 获取当前脚本所在目录并拼接目标 CSV 路径
BASE_DIR = Path(__file__).resolve().parent
file_path = BASE_DIR / 'data' / 'sales_data.csv'
df = pd.read_csv(file_path)
3. ParserError: Error tokenizing data(分词解析异常)
报错表现:ParserError: Error tokenizing data. C error: Expected X fields in line Y, saw Z
成因:文件中某些行的列数与表头列数不一致,常见于文本列内部包含未转义的分隔符(如产品描述中含有未被双引号包裹的逗号),或者末尾存在杂乱附加信息。
解决方法:如果需要快速跳过少量损坏行,在 pandas 1.3+ 版本中使用 on_bad_lines='skip';如果需要排查具体内容,可设为 'warn':
# 忽略损坏或字段数量不符的行(推荐 pandas 1.3 及以上版本)
df_safe = pd.read_csv('dirty_data.csv', on_bad_lines='skip')
# 注:在较旧版本 pandas 中对应参数为 error_bad_lines=False
4. DtypeWarning: Columns have mixed types(混合数据类型警告)
报错表现:DtypeWarning: Columns (2, 5) have mixed types. Specify dtype option on import...
成因:数据量较大时,pandas 会按块推断类型。如果某列前 1000 行全是数字,而后面出现了字符串,就会触发此警告并可能导致内存增加或后续运算类型错误。
解决方法:显式声明该列的类型,或者将 low_memory 设为 False 让解析器读完整列再统一推断:
# 方法一:显式指定有歧义的列为字符串(推荐)
df_fixed = pd.read_csv('large_data.csv', dtype={'order_sn': str, 'phone': str})
# 方法二:关闭分块低内存推断模式
df_all = pd.read_csv('large_data.csv', low_memory=False)
四、大文件读取与内存优化技巧
当 CSV 文件体积达到数 GB 时,直接调用 pd.read_csv() 会一次性将所有数据解压加载至物理内存中,容易引发系统的 MemoryError。针对超大文件,主要采用以下两种优化策略:
1. 分块迭代读取(chunksize)
通过设定 chunksize 参数,pd.read_csv() 不会立即返回一个完整的 DataFrame,而是返回一个可迭代的 TextFileReader 对象。开发者可以按批次处理并聚合运算:
import pandas as pd
chunk_size = 50000 # 每次读取 5 万行
total_amount = 0.0
# 逐块迭代处理,内存占用始终保持在低位
for chunk in pd.read_csv('huge_sales_data.csv', chunksize=chunk_size):
# 对当前块执行过滤与求和
filtered = chunk[chunk['category'] == 'Electronics']
total_amount += filtered['amount'].sum()
print(f"电子产品总销售额计算完成: {total_amount:.2f}")
2. 压缩文件直读
pandas 内部已集成压缩解压引擎,无需在操作系统层面预先解压 .gz、.zip、.bz2 或 .xz 文件,直接传入压缩包路径即可:
# 自动识别 gzip 压缩格式并流式解压读取
df_compressed = pd.read_csv('logs_2026.csv.gz', compression='gzip')
usecols 与 dtype 结合使用(如只读取核心列并使用 float32 替代默认的 float64),通常能将内存占用减少 60% 以上。
五、总结与核心参数速查
熟练运用 pandas.read_csv() 能够大幅提高数据载入阶段的稳定性与效率。在日常开发中,可以参照下述应用场景速查对应的参数组合:
通过针对不同数据特征合理搭配 sep、encoding、dtype、parse_dates 及 chunksize 等参数,可以在确保读取准确性的同时,最大化程序运行效率与系统稳定性。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









