
本文介绍如何使用正则表达式分隔符和 engine='python' 选项,让 pd.read_csv() 智能区分表头中的英文逗号与数据行中的小数逗号,从而准确加载结构混乱但格式规律的 CSV 文件。
本文介绍如何使用正则表达式分隔符和 `engine='python'` 选项,让 `pd.read_csv()` 智能区分表头中的英文逗号与数据行中的小数逗号,从而准确加载结构混乱但格式规律的 csv 文件。
在实际数据处理中,我们常遇到由第三方软件导出的“非标准”CSV文件:表头使用分号(;)和英文逗号(,)混合分隔(如 column1;column2;column3,column4,column5),而数据体中又使用逗号作为小数点(如 1,234;2,665;0,888)。此时若直接指定单一分隔符(如 sep=';' 或 sep=','),会导致列解析失败;而 pd.read_csv 并不支持为表头与数据行分别指定分隔符——但可通过正则表达式分隔符 + 上下文感知匹配巧妙解决。
核心思路是:利用正则表达式的正向先行断言(positive lookahead),仅在逗号后紧跟字母(即表头字段名起始)时才将其识别为分隔符,从而避开数据行中位于数字之间的逗号(如 1,234 中的 ,)。
✅ 正确做法如下:
import pandas as pd
df = pd.read_csv(
r"mypath est.csv", # 注意:Windows 路径建议使用原始字符串避免转义问题
sep=r';|,(?=[A-Za-z])', # 分隔符:分号 或 “后接英文字母的逗号”
skiprows=3, # 跳过前3行(元信息)
header=0, # 第4行(索引0)作为列名
engine='python', # 必须指定!C引擎不支持正则分隔符
decimal=',' # 将数据中的逗号识别为小数点
)
? 正则说明:
使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。
-
;→ 匹配所有分号; -
,(?=[A-Za-z])→ 匹配一个逗号,且该逗号后面紧跟着一个英文字母(即只匹配表头中column3,column4的逗号,跳过1,234中的逗号); - 替代写法
r';|,(?=[^d])'(逗号后非数字)亦可,但需注意表头若含数字(如col1,col2)可能误判,推荐(?=[A-Za-z])更稳健。
⚠️ 关键注意事项:
-
engine='python'不可省略:Pandas 默认的'c'引擎不支持正则分隔符,必须显式声明; -
路径需正确转义:Windows 下使用原始字符串(
r"... est.csv")或双反斜杠("...\test.csv"),避免被误解析为制表符; -
skiprows与header协同使用:skiprows=3后,原第4行变为新文件首行,故header=0才能正确捕获列名; -
避免
StringIO("file_path")错误:StringIO用于包装字符串内容,不可传入文件路径字符串——否则会报EmptyDataError。
? 进阶提示:若表头存在更复杂模式(如含空格、下划线或数字前缀),可扩展正则,例如 r';|,(?=s*[A-Za-z])' 或结合 on_bad_lines='skip' 增强鲁棒性。但对绝大多数场景,上述方案已足够精准、简洁且可维护。
最终结果将是一个拥有 5 列(column1–column5)的 DataFrame,所有数值自动转换为浮点型(如 1,234 → 1.234),完全符合预期输出。










