pandas读取CSV遇单元格未闭合引号报C tokenize错误的不忽略行修复方法
解决Pandas读取TSV时未闭合引号导致的Tokenization错误
问题根因
你当前通过delimiter='\t'读取的是TSV格式文件,Pandas默认使用的C解析器会强制校验双引号的配对逻辑,遇到单个未闭合的引号时就会触发Error tokenizing data. C error。
之前直接传csv.QUOTE_NONE出现警告的原因是:该参数和Pandas默认关联的excel-tab方言自带的quoting规则(对应csv.QUOTE_MINIMAL=3)冲突;且全局禁用引号解析会破坏其他文件中正常带引号字段的解析逻辑,存在兼容性隐患。
适配的解决方案
方案1:逐行预处理补全未闭合引号(兼容性最高,推荐自动化流程使用)
该方法先逐行检测双引号数量,若为奇数说明存在未闭合引号,自动在行尾补一个双引号后再喂给Pandas,既保留目标行不丢失,又完全不影响其他正常文件的引号解析逻辑。
import csv import pandas as pd from io import StringIO file_path = "你的文件路径" # 逐行预处理补全未闭合引号 processed_content = [] with open(file_path, 'r', encoding='utf-8') as f: for line in f: # 统计普通双引号数量(排除转义的双引号,避免误判) normal_quote_count = line.replace('\\"', '').count('"') # 引号数量为奇数说明存在未闭合引号 if normal_quote_count % 2 != 0: line = line.rstrip('\n') + '"' + '\n' processed_content.append(line) # 读取处理后的内容,保留默认的最小引用规则适配正常文件 df = pd.read_csv( StringIO(''.join(processed_content)), delimiter='\t', index_col=False, quoting=csv.QUOTE_MINIMAL )
- 适配场景:自动化流程中可能遇到个别未闭合引号,但其他文件存在正常带引号、转义引号字段需要正确解析的情况。
方案2:显式配置参数消除冲突,禁用引号解析
如果可以确认所有文件的字段都不需要做引号转义(比如你提供的正常单元格示例本身不带引号),可以显式指定引号相关参数,消除ParserWarning,同时统一禁用引号解析:
import csv import pandas as pd df = pd.read_csv( file_path, delimiter='\t', index_col=False, quoting=csv.QUOTE_NONE, # 禁用引号解析逻辑 quotechar=None, # 显式指定不使用引号字符,消除和默认方言的冲突 escapechar='\\' # 如需支持转义字符可保留该配置,无需求可删除 )
- 注意:该方案会把字段里的双引号当成普通文本保留,仅适用于确认所有文件无引号转义需求的场景。
方案3:切换Python解析引擎提升容错
如果不想做预处理,可以切换到纯Python解析引擎,该引擎对未闭合引号的容忍度更高,无需修改文件内容即可正常读取:
import csv import pandas as pd df = pd.read_csv( file_path, delimiter='\t', index_col=False, engine='python', # 切换到Python解析引擎 quoting=csv.QUOTE_NONE )
- 注意:Python引擎的解析速度远低于C引擎,仅推荐小体积文件使用。
避坑提醒
- 不要直接使用
on_bad_lines='skip',该参数会直接丢弃存在解析问题的行,不符合你保留该行的需求。 - 如果未闭合引号出现在字段中间而非行尾,可以根据实际分隔符的位置调整补全逻辑,无需统一在行尾补全。
内容的提问来源于stack exchange,提问作者Ema Il
相关产品推荐
相关产品推荐

