用pandas.read_csv读txt前须确认分隔符、编码、表头;分块读取防oom;超大文件优先转csv或parquet而非直接to_excel。

用 pandas.read_csv 读 TXT 前必须确认分隔符
绝大多数“纯文本 TXT”其实是用制表符 \t、逗号 , 或空格分隔的表格数据,不是真正无结构的段落。直接当普通文本读再写 Excel 会丢格式、乱列、吞空行。先用文本编辑器打开一个样本,看前几行实际分隔方式——常见错误是默认用 read_csv(..., sep=',') 去读制表符文件,结果整行变成一列。
实操建议:
- 用
head -n 3 sample.txt(Linux/macOS)或Get-Content sample.txt -Head 3(PowerShell)快速预览 - 若每列对齐整齐,大概率是
\t,用sep='\t' - 若字段含逗号但被英文双引号包裹(如
"apple, inc",123),必须加quotechar='"'和quoting=csv.QUOTE_MINIMAL - 不确定时,先试
pd.read_csv('x.txt', sep=None, engine='python')让 pandas 自动推断(仅限小文件)
处理超大 TXT 文件别用 to_excel 一次性写入
to_excel 会把整个 DataFrame 加载进内存再生成 .xlsx,100MB 以上 TXT 很容易 OOM。真实场景中,1GB TXT 转 Excel 卡死或报 MemoryError 是最常被忽略的坑。
实操建议:
- 用
chunksize分块读取:pd.read_csv('big.txt', chunksize=50000, sep='\t') - 用
openpyxl或xlsxwriter的Workbook对象手动追加写入,避免 pandas 全量缓存 - 更稳方案:先转为 CSV 再用 Excel 打开(CSV 无内存压力),或用
pyarrow+dataset.write_dataset输出 Parquet 供后续分析
中文列名/内容乱码?重点查 encoding 和 engine
Windows 记事本保存的 TXT 默认是 gbk,而 pandas 默认用 utf-8 解码,直接报 UnicodeDecodeError 或显示“æŸäº›æ–‡å—”。即使没报错,中文列名也可能变成问号或方块。
实操建议:
- 先用
chardet.detect(open('x.txt','rb').read(10000))粗略判断编码(注意只读前 10KB,避免大文件卡住) - 常见组合:
encoding='gbk'(简体中文 Windows)、encoding='utf-8-sig'(带 BOM 的 UTF-8)、encoding='latin-1'(兜底,不会报错但可能失真) - 如果指定
encoding后仍乱码,换engine='python'(比默认c引擎容错更强)
没有表头的 TXT 怎么自动补列名
很多日志类 TXT 第一行不是列名,而是数据本身,直接 read_csv 会被当列名,导致少一行数据、列名错位。不能靠猜,得看业务逻辑。
实操建议:
- 用
header=None强制不解析首行,再用names=['col1','col2',...]显式指定 - 若列数固定但未知含义,用
names=[f'col_{i}' for i in range(N)]占位,后续人工映射 - 若首行确实是数据,且你有字段定义文档,优先按文档顺序写
names,别依赖infer_columns=True(pandas 没这参数)
真正“海量”意味着你要面对编码混杂、分隔符不一致、部分行字段缺失、单文件超 2GB 这些问题——这时候与其硬塞进 Excel,不如确认下游是否真的需要 .xlsx 格式。Excel 行数上限是 1048576,超过就得拆表或换数据库。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











