pd.read_csv()可读取任意分隔符txt文件,关键设sep参数;需注意编码、引号、空格处理及大文件性能优化。

用 pd.read_csv() 读取非标准分隔符的 TXT 文件
只要分隔符不是逗号,pd.read_csv() 就能搞定——它本质是通用文本解析器,不只读 CSV。关键在 sep 参数,直接传入你的分隔符字符串(支持正则,但多数情况不需要)。
常见错误是看到文件名带 .txt 就下意识换用 pd.read_table(),其实没必要:pd.read_table() 只是 pd.read_csv(sep='\t') 的别名,硬切分隔符反而容易漏掉空格、多空格或混合分隔场景。
- 单字符分隔(如竖线
|、井号#):直接写sep='|'或sep='#' - 多个空格或制表符:用
sep='\s+'(注意加engine='python',否则默认 C 引擎不支持正则) - 固定宽度(无明确分隔符):别用
sep,改用pd.read_fwf() - 首行不是列名?加
header=None;列名需手动指定?用names=['a','b','c']
处理带引号、换行符或编码异常的 TXT
真实数据常含嵌套引号、字段内换行、BOM 头或 GBK 编码,pd.read_csv() 默认会崩。必须提前干预:
- 中文乱码?先试
encoding='gbk',再试encoding='utf-8-sig'(自动去掉 BOM) - 某字段含换行符导致行数错乱?加
quoting=csv.QUOTE_ALL(需import csv),并确保sep不与引号内字符冲突 - 字段被双引号包裹但内容含逗号?设
quotechar='"'和quoting=csv.QUOTE_MINIMAL(默认值,通常够用) - 跳过前几行垃圾注释?用
skiprows=2;跳过末尾几行?暂不支持,得先用open()截断再传给read_csv()
性能陷阱:大文件别默认加载全部列
读几百 MB 的 TXT 时,pd.read_csv() 默认推断每列 dtype,耗时且内存爆炸。实际中多数列只需 str 或 float64,应主动约束:
- 只读需要的列:用
usecols=[0,2,5]或usecols=['name','score'] - 强制指定类型:如
dtype={'id': 'int32', 'price': 'float32'},避免后期astype()再转换 - 超大文件分块读:加
chunksize=10000返回迭代器,配合pd.concat()拼接(注意内存峰值) - 忽略索引列节省空间:如有第一列纯序号,加
index_col=0,否则它会被当普通数据列读入
验证分隔符是否真“特殊”:先看前几行
别猜分隔符。用系统命令或 Python 快速抽样:
head -n 3 data.txt
或在 Python 中:
with open('data.txt', encoding='utf-8') as f:
for i, line in enumerate(f):
if i >= 3: break
print(repr(line))
repr() 能暴露不可见字符(如 '\t'、'\x01')。若看到 'a|b|c\n',就用 sep='|';若看到 'a b c\n',优先试 sep='\s+' 而非 sep=' '(后者无法处理多个空格)。
真正麻烦的是分隔符出现在数据内容里又没被引号包裹——这种文件格式本身就有缺陷,pandas 无法可靠解析,得先清洗或换工具。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











