Python2.7下Pandas DataFrame转列表UTF-8编码转换故障求助
在Python 2.7里处理Unicode确实容易踩坑,毕竟它的字符串模型和Python 3差异很大。你遇到的编码异常,大概率是因为Pandas在Python 2中会把Excel里的字符串存为unicode类型,直接转成列表后,终端输出、文件写入或者后续处理时,默认用了ASCII编码去处理这些Unicode字符串,导致乱码或编码错误。下面是几个针对性的解决办法:
显式转换Unicode为UTF-8字节串
转换列表时,遍历每个元素,把unicode类型的字符串编码为UTF-8格式的str(字节串),保留其他类型的数据不变:# 先把DataFrame转为基础列表 raw_list = df.values.tolist() # 处理每个元素的编码 encoded_list = [ [s.encode('utf-8') if isinstance(s, unicode) else s for s in row] for row in raw_list ]这样处理后,列表里的字符串就都是UTF-8编码的字节串,后续操作就不会触发ASCII编码的错误了。
正确处理文件输出/终端显示
如果是打印到终端,确保你的终端默认编码是UTF-8(比如Linux/macOS的终端一般默认是UTF-8,Windows可能需要调整);如果是写入文件,不要用Python 2默认的open(),改用codecs模块指定UTF-8编码写入:import codecs # 写入处理后的列表到文件 with codecs.open('output.txt', 'w', encoding='utf-8') as f: f.write(str(encoded_list))全局默认编码调整(不推荐但应急可用)
如果你不想逐个处理字符串,可以临时修改Python的默认编码为UTF-8,但这个方法可能影响其他依赖默认编码的代码,谨慎使用:import sys reload(sys) sys.setdefaultencoding('utf-8')修改后,Pandas转列表时的Unicode字符串会自动按UTF-8处理,但这个操作在Python 3里已经被移除,属于Python 2的“黑魔法”,尽量少用。
另外,补充个小提醒:Python 2.7已经停止维护多年了,如果可能的话,升级到Python 3.x会彻底解决这类编码问题,因为Python 3默认用Unicode字符串,编码处理逻辑清晰很多。
内容的提问来源于stack exchange,提问作者yellow days

