如何读取列以双引号空格分隔、字段含特殊字符的CSV文件?
特殊格式CSV读取问题及解决方案
问题背景
常规CSV文件多使用逗号、竖线|等作为分隔符,本次遇到的CSV格式特殊,数据行示例如下:
"2017-02-27 ""2017-02-25"" ""15438"" ""2017-02-27",19,"671"" ""1"" ""14"" ""John Smith"" ""614""
每行共对应8个字段,其中2017-02-27",19,"671为单个字段,内部包含引号和逗号,初步判断实际列分隔符为"" ""。
附加问题
CSV首行是表头,表头之间仅用空格分隔,表头本身包含下划线(示例:name_1 name_2 name_3),询问是直接通过read_csv的参数配置读取表头更合适,还是直接将表头复制为列表传给names参数更简单。
已验证的失效方案
此前尝试过多种社区常见方案,均未达到预期效果:
- 配置
sep='"" ""',会将整行识别为单列 - 配置
sep=',\s+',quoting=csv.QUOTE_ALL,拆分结果不符合预期 - 配置
sep=" ", quotechar="~",拆分结果不符合预期 - 配置
sep='[" ]* [" ]*', engine='python',拆分结果不符合预期
可行解决方案
表头处理建议
由于表头的分隔规则(空格分隔)和数据行的分隔规则完全不同,无需额外编写复杂的参数兼容两种规则,直接将表头复制为列表传给names参数更简单高效。
数据读取代码
df = pd.read_csv( 'test.csv', header=None, sep='\s""', engine='python', skiprows=1, index_col=False ).replace('"','', regex=True) # 后续可自行给df.columns赋值为提前整理好的表头列表
实现思路
- 先指定
sep='\s""'作为分隔符拆分,适配首两列及其余列的分隔规则 - 跳过首行表头,避免和数据行的分隔规则冲突
- 最后通过正则替换批量去除所有多余的双引号,完成数据清洗
内容的提问来源于stack exchange,提问作者Nore Patel
相关产品推荐
相关产品推荐

