如何用pandas处理CSV列中的Unicode转义字符转换为重音字符?
解决CSV中Unicode转义字符的解析问题
我来帮你搞定这个Unicode转义的问题!你遇到的情况是:CSV里的Col2列把Unicode转义序列(比如\u00e9)当成了普通字符串存储,而pandas默认不会自动解析这些转义——这就是为什么你加了encoding='utf-8'也没效果,因为这个参数是用来解码文件的字节流,而不是处理字符串里的转义序列。
下面是两种简单有效的修复方法:
方法一:读取后批量处理列
先正常读取CSV,再对Col2列做转义解码处理,如果你的Col2是列表格式的字符串(比如例子里的["consommation ..."]),还可以顺便把它转成实际的列表对象:
import pandas as pd import ast # 正常读取CSV,不用额外改encoding(Col1已经正常读取,问题不在文件编码) df = pd.read_csv('data.csv', delimiter=',', header=0) # 定义处理函数:解码Unicode转义,可选解析为列表 def fix_unicode(s): # 把字符串中的Unicode转义序列解码成实际字符 decoded_str = s.encode('utf-8').decode('unicode-escape') # 如果是列表格式的字符串,转成Python列表(不需要的话可以删掉try-except块) try: return ast.literal_eval(decoded_str) except ValueError: return decoded_str # 应用到Col2列 df['Col2'] = df['Col2'].apply(fix_unicode) # 查看修复后的结果 print(df.head()) # 保存修复后的CSV,用utf-8编码确保字符正常显示 df.to_csv('fixed_data.csv', encoding='utf-8', index=False)
方法二:读取时直接转换
如果你想一步到位,在读取CSV的过程中就处理Col2,可以用converters参数指定转换函数:
import pandas as pd import ast def convert_col2(s): decoded = s.encode('utf-8').decode('unicode-escape') # 同样,如果不需要转列表就直接return decoded return ast.literal_eval(decoded) # 读取时直接处理Col2 df = pd.read_csv('data.csv', delimiter=',', header=0, converters={'Col2': convert_col2})
为什么这两种方法有效?
encode('utf-8').decode('unicode-escape')这个操作的作用是:把字符串里的Unicode转义序列(比如\u00e9)转换成对应的UTF-8字符(é)。而ast.literal_eval则是把列表格式的字符串(比如["abc"])转换成真正的Python列表对象,方便后续操作。
测试一下的话,处理后Col2里的\u00e9nerg\u00e9tique会变成énergétique,b\u00e2timents会变成bâtiments,和Col1的显示完全一致啦!
内容的提问来源于stack exchange,提问作者Serk
相关产品推荐
相关产品推荐

