如何使用pandas读取字段含多引号和逗号的不规范CSV文件
不规范CSV文件读取解决方案
针对字段内部存在未转义双引号、分隔符逗号,且无法提前预知异常列的不规范CSV场景,可通过正则匹配字段的方案完成读取,具体实现如下:
实现思路
观察提供的CSV结构,所有字段均以双引号包裹,字段之间以逗号分隔,因此可以通过正则匹配所有符合"内容"格式且后接逗号/行尾的单元,直接提取每一行的字段,避开内置CSV解析器对内部双引号的默认转义判断。
代码实现
import re import pandas as pd # 匹配双引号包裹的字段,非贪婪匹配避免跨字段 field_pattern = re.compile(r'"(.*?)"(?=,|$)') # 读取文件全量内容 with open("你的文件路径.csv", "r", encoding="utf-8") as f: all_lines = f.readlines() # 解析表头,确认总字段数 header = field_pattern.findall(all_lines[0]) total_cols = len(header) parsed_rows = [] for line in all_lines[1:]: # 提取当前行所有匹配的字段 fields = field_pattern.findall(line) # 异常兼容:如果匹配到的字段数超过总字段数,将多余内容合并到最后一个字段 if len(fields) > total_cols: fields = fields[:total_cols - 1] + [','.join(fields[total_cols - 1:])] parsed_rows.append(fields) # 转换为DataFrame df = pd.DataFrame(parsed_rows, columns=header)
注意事项
- 如果CSV存在未用双引号包裹的普通字段,可以调整正则规则匹配非逗号开头的普通内容即可
- 如果出现极端异常行,可提前统计所有行的字段数,取出现频率最高的数值作为
total_cols基准值,提升解析兼容性
内容的提问来源于stack exchange,提问作者Tomas Cardoso
相关产品推荐
相关产品推荐

