
本文详解使用pandas读取竖线(|)分隔的CSV文件时常见的列解析失败问题,提供准确的sep参数设置、编码处理及调试方法,并给出可直接运行的完整示例代码。
本文详解使用pandas读取竖线(|)分隔的csv文件时常见的列解析失败问题,提供准确的`sep`参数设置、编码处理及调试方法,并给出可直接运行的完整示例代码。
在使用 pandas.read_csv() 读取以竖线(|)为字段分隔符的CSV文件时,若未显式指定正确的分隔符或编码方式,极易出现“表头显示正常但数据未拆分”——即所有字段被合并为单列的现象(如图中所示:仅显示一列,内容为整行原始字符串)。这并非pandas缺陷,而是因默认分隔符为英文逗号(,),当文件实际使用 | 时,必须通过 sep 参数明确告知。
✅ 正确做法是严格匹配文件真实分隔符。若确认文件使用 | 分隔,请确保:
- sep='|'(注意:单竖线在正则中具特殊含义,但pandas的sep参数默认为普通字符串模式;若后续需支持正则分隔,应设 engine='python',但对纯|无需此操作);
- 同时验证文件编码(如ANSI/GBK/UTF-8-BOM等),避免乱码导致解析中断。
以下是推荐的稳健读取方案:
import pandas as pd
# 方案1:明确指定竖线分隔符 + 常见编码(优先尝试 utf-8)
try:
df = pd.read_csv(
'C:/dane/raport_d.csv',
sep='|',
encoding='utf-8',
low_memory=False
)
except UnicodeDecodeError:
# 若报编码错误,尝试常见兼容编码(如 Windows-1250 / GBK / ISO-8859-1)
df = pd.read_csv(
'C:/dane/raport_d.csv',
sep='|',
encoding='ISO-8859-1', # 或 'windows-1250'(适用于东欧ANSI文件)
low_memory=False
)
print(df.head())
print(f"列数:{df.shape[1]}, 行数:{df.shape[0]}")⚠️ 注意事项:
- ❌ 避免混淆 sep="\t"(制表符)与 sep="|":二者完全无关,除非文件实际用Tab分隔,否则改用\t将导致解析彻底失败;
- ✅ 使用 low_memory=False 可防止pandas因逐块推断类型而引发列数不一致警告;
- ? 若仍无法正确分离,建议先用文本编辑器(如VS Code、Notepad++)打开CSV文件,确认首行是否含BOM头、是否存在隐藏空格或混合分隔符(例如部分行用|、部分用;);
- ? 调试技巧:用 pd.read_csv(..., nrows=5, verbose=True) 快速预览前5行解析效果,或配合 df.iloc[0].values 查看原始第一行是否被正确切分。
总结:解决竖线分隔CSV读取异常的核心在于 精准指定 sep='|' + 合理选择 encoding。切勿依赖默认参数,务必根据源文件实际格式定制读取配置。完成加载后,建议立即检查 df.shape 和 df.columns,确保列数与预期一致,这是验证解析成功的最简有效方式。










