Pandas读取含引号/逗号的分号分隔CSV及字符替换问题排查
解决分号分隔CSV加载、双引号替换及df.query漏行问题
一、正确加载含特殊字符的分号分隔CSV
你的核心问题是CSV里的未转义双引号干扰了Pandas的列解析,导致整行被识别为单列。直接禁用引号解析功能即可,同时指定Python引擎(C引擎对部分参数支持有限):
import pandas as pd import csv df = pd.read_csv( "你的文件路径.csv", sep=";", dtype=str, # 确保所有列加载为字符串类型 quoting=csv.QUOTE_NONE, # 完全禁用引号解析,双引号当作普通字符 engine="python" )
这个参数组合会让Pandas忽略双引号的特殊含义,严格按分号拆分列,不会出现整行归为一列的情况。
二、批量替换双引号为两个双引号
用lambda没效果大概率是写法问题,推荐用Series的str.replace方法批量处理,效率更高:
# 对所有字符串列执行替换 df = df.apply(lambda col: col.str.replace('"', '""', regex=False))
regex=False确保只替换普通双引号,不会触发正则解析,避免意外匹配。如果担心非字符串值(虽然你说都是object类型),可以加个类型判断:
df = df.applymap(lambda s: s.replace('"', '""') if isinstance(s, str) else s)
三、解决df.query漏行问题
df.query是通过解析字符串表达式实现的,当目标值含双引号时,会打断表达式的语法结构,导致匹配失败。直接用布尔索引替代df.query即可彻底解决:
# 示例:筛选某列等于目标值的行 target = 'TES"T_ING,_VALUE' subset = df[df["目标列名"] == target]
布尔索引直接比较原始字符串,不受特殊字符影响,不会漏掉任何符合条件的行。如果一定要用df_query,需要手动转义双引号(用单引号包裹目标值):
subset = df.query('目标列名 == @target')
这里用@引用变量,Pandas会自动处理变量里的特殊字符,避免语法错误。
内容的提问来源于stack exchange,提问作者thomaspane
相关产品推荐
相关产品推荐

