Pandas处理CSV硬编码Unicode字符转对应字符失败问题
解决CSV中硬编码Unicode转义字符的替换问题
这个问题我碰到过好几次,核心原因是你误解了CSV里存储的内容——那些\u00e9并不是Python层面的Unicode字符,而是作为普通文本存储的转义序列(也就是实际字符串里是\、u、0、0、e、9这几个独立字符)。你之前用'\u00e9'去匹配,其实是在找已经解析后的Unicode字符é,自然找不到目标内容。
下面给你两种可行的解决方法:
方法一:针对性正则替换(适合单种转义)
如果只需要处理\u00e9这类特定转义,直接用正则匹配原始的转义文本,注意要转义反斜杠(因为反斜杠在正则里是特殊字符):
df['Objectif(s)'] = df['Objectif(s)'].replace(r'\\u00e9', 'é', regex=True)
- 这里
r'\\u00e9'是原始字符串,代表匹配文本中的\u00e9序列 - 必须加上
regex=True,否则pandas会默认尝试匹配整个字符串,而不是子串
方法二:批量解析所有Unicode转义(通用方案)
如果你的CSV里还有其他类似的Unicode转义(比如\u00e0、\u00e8等),用ast.literal_eval可以一次性解析所有转义序列,把文本转成正常的Unicode字符:
import ast # 注意要处理可能的非字符串值,避免报错 df['Objectif(s)'] = df['Objectif(s)'].apply( lambda x: ast.literal_eval(x) if isinstance(x, str) else x )
这个方法的原理是让Python把字符串里的转义序列当成代码层面的转义来解析,比如把文本中的\u00e9解析成实际的é字符。
为什么你之前的方法失效?
你单独测试时写的s = "d'activit\u00e9s",Python在定义字符串时已经自动把\u00e9解析成了é,所以替换有效;但CSV里的内容是读取后保留了原始的转义文本(也就是字符串里存的是\u00e9这几个字符),所以用'\u00e9'去匹配完全找不到对应内容。
验证结果
处理完成后,可以用下面的代码确认效果:
print(df['Objectif(s)'].head())
内容的提问来源于stack exchange,提问作者Serk
相关产品推荐
相关产品推荐

