Pandas如何通过正则移除DataFrame前置特殊字符
问题根因
你看到的前置异常字符是UTF-8 BOM(字节顺序标记,字节序列为0xEF 0xBB 0xBF)被错误编码解析后生成的乱码。你当前代码中pd.read_csv传入的encoding='base64'是无效参数——base64是二进制转文本的编码格式,不是CSV文本读取支持的字符编码,这是乱码产生的直接原因。
解决方法
根源修复(推荐,无需正则)
不需要额外写正则清洗,只要把读取时的字符编码改成支持BOM自动识别的utf-8-sig,pandas会在读取阶段自动剥离BOM标记,从源头避免乱码,修改后的读取代码如下:
# 移除错误的encoding='base64'参数,替换为utf-8-sig dt = pd.read_csv(StringIO(response.text), sep="|", encoding='utf-8-sig')
如果requests自动解码响应内容的逻辑有问题,直接取响应原始字节解码再读取,兼容性更好:
# 从响应原始字节解码,自动剥离BOM decoded_content = response.content.decode('utf-8-sig') dt = pd.read_csv(StringIO(decoded_content), sep="|")
正则清洗(已生成乱码DataFrame的补救方案)
如果已经生成了带乱码的DataFrame,可以通过正则批量清洗列名和所有字符串字段中的异常字符,步骤如下:
- 编译正则规则,匹配所有位置出现的
乱码序列 - 先清洗DataFrame列名
- 遍历所有字符串类型列,清洗字段内容
参考代码:
import re import pandas as pd from io import StringIO # 定义清洗正则 clean_re = re.compile(r'') # 清洗列名 dt.columns = [clean_re.sub('', str(col)).strip() for col in dt.columns] # 清洗所有字符串列内容 str_columns = dt.select_dtypes(include=['object', 'string']).columns for col in str_columns: dt[col] = dt[col].apply( lambda val: clean_re.sub('', str(val)) if pd.notna(val) else val )
提示:正则清洗属于事后补救手段,优先使用编码修正的方案,能避免其他潜在的乱码问题。
内容的提问来源于stack exchange,提问作者Patterson
相关产品推荐
相关产品推荐

