文章目录
为什么你的CSV读取方式该升级了?
还在用Python原生csv模块吭哧吭哧读数据?(太原始啦!)pandas的read_csv()方法才是数据处理界的瑞士军刀!这个不到1秒就能把CSV变DataFrame的神器,今天必须把它的裤衩都扒干净!
一、基础必杀技(建议全文背诵)
1.1 基本食用姿势
import pandas as pd
# 最简写法(文件路径记得加r!)
df = pd.read_csv(r'D:\data\sales.csv')
# 查看前3行(默认显示5行太占地方)
print(df.head(3))
1.2 参数黑魔法(超实用!)
参数名 | 作用说明 | 典型场景 |
---|---|---|
sep | 指定分隔符(默认逗号) | 处理TSV文件:sep=‘\t’ |
header | 指定标题行(默认第0行) | 无表头文件:header=None |
names | 自定义列名 | 重命名乱码的列名 |
dtype | 强制指定列类型 | 防止手机号变成科学计数法 |
parse_dates | 日期解析 | 自动转换日期格式 |
skiprows | 跳过指定行 | 跳过文件开头的注释行 |
二、实战中的骚操作
2.1 处理百万级大文件
# 分块读取(内存杀手克星!)
chunk_size = 100000
chunks = pd.read_csv('big_data.csv', chunksize=chunk_size)
for chunk in chunks:
process(chunk) # 你的处理函数
2.2 智能类型推断(超智能!)
# 自动检测日期列(识别50+种日期格式!)
df = pd.read_csv('log.csv', infer_datetime_format=True)
# 强制字符串读取(防止前导零丢失!)
df = pd.read_csv('product.csv', dtype={'产品编号': str})
三、避坑指南(血泪经验)
3.1 编码问题大全
# 常见编码尝试顺序(遇到乱码时挨个试!)
encodings = ['utf-8', 'gbk', 'gb2312', 'latin1']
for enc in encodings:
try:
df = pd.read_csv('神秘文件.csv', encoding=enc)
break
except:
continue
3.2 缺失值处理技巧
# 多种缺失值标记(小心隐藏的空值!)
df = pd.read_csv('dirty_data.csv',
na_values=['NA', 'null', '--', 'NaN', ''])
# 保留特定空值(比如合法的"N/A"字段)
df = pd.read_csv('survey.csv',
keep_default_na=False,
na_values=[''])
四、高阶玩法(秀到飞起)
4.1 正则表达式读取
# 用正则处理变态分隔符(什么鬼格式都能吃!)
df = pd.read_csv('weird_format.csv',
sep='\s*[,|]\s*', # 匹配逗号或竖线
engine='python')
4.2 在线文件直读(不用下载!)
import requests
url = 'http://data.com/api/download.csv'
df = pd.read_csv(requests.get(url).content.decode('utf-8'))
五、性能优化(速度提升10倍!)
5.1 指定列读取(拒绝无用数据)
# 只读取需要的列(内存立即瘦身!)
cols_needed = ['name', 'price', 'date']
df = pd.read_csv('large.csv', usecols=cols_needed)
5.2 使用C引擎
# 默认是C引擎(比python引擎快2-5倍!)
df = pd.read_csv('data.csv', engine='c')
# 处理超大文件建议开启low_memory模式
df = pd.read_csv('huge.csv', low_memory=False)
六、Debug神技(建议收藏)
当read_csv()报错时,按这个顺序检查:
- 文件路径是否正确(绝对路径前加r!)
- 编码是否正确(尤其中文文件!)
- 分隔符是否匹配(用pd.parser.csv_sniff检测)
- 是否存在不一致的列数
- 内存是否不足(尝试分块读取)
举个实战案例:
from pandas.errors import ParserError
try:
df = pd.read_csv('problem.csv')
except ParserError as e:
print(f"第{e.row}行有问题!具体错误:{e.msg}")
# 自动跳过错误行
df = pd.read_csv('problem.csv', error_bad_lines=False)
七、冷知识(装逼用)
- read_csv()可以直读压缩包文件(自动解压.zip/.gz)
- 支持从剪贴板读取数据(pd.read_clipboard())
- 可以处理带HTML实体的数据( 等自动转换)
- 支持指定十进制格式(欧洲数据常用,decimal=‘,’)
# 读取德国格式的CSV(逗号小数点)
df = pd.read_csv('german_data.csv', decimal=',')
最后的大杀器
把read_csv参数写成配置字典,一劳永逸!
csv_config = {
'sep': ';',
'encoding': 'gbk',
'parse_dates': ['下单时间'],
'dtype': {'用户ID': 'str'},
'na_values': ['未知']
}
df = pd.read_csv('daily_data.csv', **csv_config)
看完这篇还搞不定CSV文件?建议你…再看一遍!(毕竟pandas有100+个参数呢)下次遇到奇葩CSV时,记得回来查这个宝典!