如何在Pandas中读取含特殊引号格式的CSV文件
解决含特殊引号格式的CSV文件读取问题
问题场景
CSV文件以逗号为分隔符,原本用英文双引号"包裹含逗号的字段避免误解析,但字段内存在三种特殊引号格式,导致Pandas的read_csv无法正确识别字段边界,出现列错位、行跳过或报错:
- 转义双引号:
\" - 双单引号:
'' - 未转义的中文左双引号:
“(全角字符)
示例数据
表头:开始日期,结束日期,产品编码,是否可用,品类排名,品牌,名称,品类,价格
异常数据行:
2022-10-05,2022-10-10,3716372837,1.0,"",brand1,"世界拼图地图,300片,23” x 15\",全年龄段适用",Games,39.99
该行中"世界拼图地图,300片,23” x 15\",全年龄段适用"应被识别为单个字段,但中文引号“会被误判为字段结束,导致解析失败。
解决方案
方案1:预处理CSV文件(推荐)
先统一修正文件中的异常引号,再用Pandas读取:
1. 编写预处理脚本
遍历每行,将异常引号转换成Pandas可识别的格式:
import csv input_file = "your_input.csv" output_file = "cleaned_csv.csv" with open(input_file, 'r', encoding='utf-8') as in_f, open(output_file, 'w', encoding='utf-8', newline='') as out_f: reader = csv.reader(in_f) writer = csv.writer(out_f, quotechar='"', escapechar='\\', quoting=csv.QUOTE_MINIMAL) for row in reader: cleaned_cells = [] for cell in row: # 把中文左引号替换成转义双引号 cell = cell.replace('“', '\\"') # 把双单引号替换成单个单引号(可选,根据业务需求调整) cell = cell.replace("''", "'") cleaned_cells.append(cell) writer.writerow(cleaned_cells)
2. 读取处理后的文件
用Pandas读取时指定正确的参数:
import pandas as pd import csv df = pd.read_csv( "cleaned_csv.csv", quotechar='"', escapechar='\\', dtype={"产品编码": str} # 避免长数字被转成科学计数法 )
方案2:自定义行解析器
如果预处理无法覆盖所有场景,可手动编写解析逻辑识别字段边界:
import pandas as pd def parse_csv_line(line): fields = [] current_field = [] in_quote = False for char in line.strip(): if char == '"' and not in_quote: in_quote = True elif char == '"' and in_quote: # 判断是否是转义引号 if current_field and current_field[-1] == '\\': current_field.append(char) else: in_quote = False elif char == ',' and not in_quote: # 非引号内的逗号作为分隔符 fields.append(''.join(current_field).strip()) current_field = [] else: # 处理中文引号 if char == '“': current_field.append('\\"') else: current_field.append(char) # 添加最后一个字段 fields.append(''.join(current_field).strip()) return fields # 读取并解析文件 with open("your_input.csv", 'r', encoding='utf-8') as f: header = parse_csv_line(f.readline()) data_rows = [parse_csv_line(line) for line in f if line.strip()] df = pd.DataFrame(data_rows, columns=header)
注意事项
- 替换逻辑需根据实际业务调整,比如中文引号是否代表双引号或单引号
- 长数字字段(如产品编码)务必指定
dtype=str,防止Pandas自动转换为数值类型 - 大文件建议分块预处理,避免内存溢出
内容的提问来源于stack exchange,提问作者William Johnson
相关产品推荐
相关产品推荐

