使用Pandas读取CSV时特定行前导空格丢失问题排查
问题描述
使用以下代码读取CSV文件时,指定token列为字符串类型,但出现异常行为:
import pandas as pd df = pd.read_csv( "sample.csv", dtype={'token': str}, keep_default_na=False )
- 文本编辑器中第20851行的
token值为' 29'(带前导空格),但执行df.loc[20851,'token']返回无空格的'29'; - 第30118行带前导空格的
' 66'可被正确读取; - 手动设置
df.loc[20851,'token'] = ' 29'并保存CSV,重新读取后问题依旧;设置为两个前导空格' 29',重新读取后仅保留一个; - 已尝试
encoding='utf8'、skipinitialspace=False、delim_whitespace=False等参数,均无效果。
解决方案
- 切换至Python引擎读取
默认的C引擎可能存在隐性的空格处理逻辑,改用Python引擎可实现更严格的字符串解析:
import pandas as pd df = pd.read_csv( "sample.csv", dtype={'token': str}, keep_default_na=False, engine='python' )
- 检查空格类型是否为特殊字符
文本中显示的“空格”可能是全角空格、非-breaking空格(NBSP)等特殊字符,用repr()查看字符串的真实内容:
print(repr(df.loc[20851, 'token']))
如果输出为'\u300029'(全角空格)或'\xa029'(NBSP),说明是特殊空格,可通过字符串替换统一为普通半角空格:
df['token'] = df['token'].replace('\u3000', ' ').replace('\xa0', ' ')
- 保存CSV时强制引号包裹所有字段
手动修改后保存时,pandas默认逻辑可能处理带空格的字符串,导致重新读取时丢失空格。保存时指定quoting=csv.QUOTE_ALL确保所有字段被引号包裹:
import csv df.to_csv("sample.csv", quoting=csv.QUOTE_ALL, index=False)
- 检查目标行的CSV格式
用文本编辑器打开CSV,确认第20851行的token字段是否与其他行格式一致(比如是否被引号包裹、分隔符是否正确)。若该行字段未被引号包裹,可能导致解析逻辑异常。
内容的提问来源于stack exchange,提问作者Sourya Dey
相关产品推荐
相关产品推荐

