Pandas read_csv读取含未转义引号CSV文件出现坏行错误解决方案咨询
问题核心是你拿到的CSV不符合RFC4180标准,字段内容内的双引号没有做转义(标准要求要么加转义符,要么写两个连续双引号),导致解析器无法区分字段边界和内容引号,以下是可行的处理方案:
方案1:调整csv读取参数适配非标准格式
改用容错性更高的Python解析引擎,搭配自定义引号相关参数适配未正确转义的嵌套双引号场景,代码示例:
import pandas as pd import csv ch = pd.read_csv( file, chunksize=100000, low_memory=False, encoding="iso-8859-1", engine="python", # Python引擎对非标准格式的容错性远高于默认C引擎 quotechar='"', doublequote=False, # 不将连续双引号识别为转义字符,适配单双引号嵌套场景 on_bad_lines="warn" # 若仍有异常行先打印排查,不需要丢行可传入自定义处理函数 ) df = pd.concat(ch)
方案2:预修复文件引号问题后读取
如果参数调整无法覆盖所有异常行,可以先按行读取文件,统一修复内容中的引号规则后再传给pandas解析:
import pandas as pd from io import StringIO # 按行读取并修复引号 with open(file, "r", encoding="iso-8859-1") as f: raw_lines = f.readlines() fixed_lines = [] for line in raw_lines: # 修复逻辑:仅保留字段边界的双引号,字段内部的双引号统一加转义符 quote_parts = line.split('"') if len(quote_parts) <= 2: fixed_lines.append(line) continue # 首尾为边界引号无需转义,中间所有引号统一转义 fixed_line = quote_parts[0] + '"' + '\\"'.join(quote_parts[1:-1]) + '"' + quote_parts[-1] fixed_lines.append(fixed_line) # 读取修复后的内容 ch = pd.read_csv( StringIO("".join(fixed_lines)), chunksize=100000, low_memory=False, quotechar='"', encoding="iso-8859-1" ) df = pd.concat(ch)
你可以根据实际CSV格式调整修复逻辑,如果字段内容中不存在分隔符,也可以直接按分隔符拆分后再逐个去除字段首尾的引号。
方案3:跳过引号解析手动处理字段
如果你的CSV分隔符不会出现在任何字段内容中,可以完全禁用引号解析,拆分后再手动清理每个字段的多余引号:
import pandas as pd import csv ch = pd.read_csv( file, chunksize=100000, low_memory=False, encoding="iso-8859-1", sep=",", # 替换为你实际使用的分隔符 quoting=csv.QUOTE_NONE, # 完全禁用引号解析逻辑 quotechar=None ) df = pd.concat(ch) # 清理所有字符串类型字段首尾的多余双引号 for col in df.select_dtypes(include=["object"]).columns: df[col] = df[col].str.strip('"')
内容的提问来源于stack exchange,提问作者Rasmus
相关产品推荐
相关产品推荐

