python2.7读取DataFrame中的中文出现问题
name industry area pe outstanding
code
000001 平安银行 银行 深圳 7.51 1180405.50
code
000001 平安银行 银行 深圳 7.51 1180405.50
....
比如上面的df,我读取平安银行,df.loc['000001','name']
却得到'xe5xb9xb3xe5xaex89xe9x93xb6xe8xa1x8c'
我也试了用encode,decode各种转,但是就是转不成中文...
我用的是python2.7,windos7
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
你是不是直接拷贝我的代码粘贴到Python交互环境中实验的?如果是,拷贝过程中,已经出问题了,请不要这样,请自己输入。
具体编码知识,维基百科就够了。
回复
谢谢!
引用来自“邱Sir”的评论
不明白题主说的“转不成中文”是什么意思。
在Windows 7简体中文环境下,默认标准输出(就是运行cmd命令后的窗口)中的默认字符编码是CP936(绝大部分字符集和GBK兼容),要用Python 2.x的print语句(或者函数)在标准输出中输出中文字符,可以:
1. 用print输出已经用CP936编码过的str对象;
2. 直接用print输出unicode对象。
例子如下:
如果我们把us进行非标准输出的编码,如UTF-8,则编码过程是正常,但是用print输出就会乱码,如下:
这是因为,在上面的例子中,用UTF-8方式编码编码了unicode对象后,一个中文汉字一般用3个字节表示的,而在CP936编码方式中,一个中文字符一般只用2个字节表示。用print输出s_u8是,程序会认为'xe5xb9'是一个GBK编码的字符,于是就出现乱码了。
回到题主的问题,你得到的'xe5xb9xb3xe5xaex89xe9x93xb6xe8xa1x8c'正好是“平安中国”这段文字的UTF-8编码格式,说明你的DataFrame中name这个field是用UTF-8编码方式存储。在获得这个field的数据后,如果你需要后面对其进行处理,建议先解码成unicode对象。
把text转化成binary,这个是编码;把binary转化成text,这个是解码。
注意:
Python 2.x对于字符编解码这一块设计很不好,有很多陷阱。
很多书籍是这么建议用“三明治”方式处理的:
1. 读取I/O,得到binary数据,转化成text(如Python 2.x中的unicode对象)
2. 在程序中统一用text来处理
3. 写入I/O操作,先把text转化成binary数据,在写入I/O
当然,Python 3.x在编码这一块处理的比较好,如果题主能够迁移到Python 3.x的环境下,建议先阅读文档中这一部分的内容,很多问题就能迎刃而解了。
合情合理!
不明白题主说的“转不成中文”是什么意思。
在Windows 7简体中文环境下,默认标准输出(就是运行cmd命令后的窗口)中的默认字符编码是CP936(绝大部分字符集和GBK兼容),要用Python 2.x的print语句(或者函数)在标准输出中输出中文字符,可以:
1. 用print输出已经用CP936编码过的str对象;
2. 直接用print输出unicode对象。
例子如下:
如果我们把us进行非标准输出的编码,如UTF-8,则编码过程是正常,但是用print输出就会乱码,如下:
这是因为,在上面的例子中,用UTF-8方式编码编码了unicode对象后,一个中文汉字一般用3个字节表示的,而在CP936编码方式中,一个中文字符一般只用2个字节表示。用print输出s_u8是,程序会认为'xe5xb9'是一个GBK编码的字符,于是就出现乱码了。
回到题主的问题,你得到的'xe5xb9xb3xe5xaex89xe9x93xb6xe8xa1x8c'正好是“平安中国”这段文字的UTF-8编码格式,说明你的DataFrame中name这个field是用UTF-8编码方式存储。在获得这个field的数据后,如果你需要后面对其进行处理,建议先解码成unicode对象。
把text转化成binary,这个是编码;把binary转化成text,这个是解码。
注意:
Python 2.x对于字符编解码这一块设计很不好,有很多陷阱。
很多书籍是这么建议用“三明治”方式处理的:
1. 读取I/O,得到binary数据,转化成text(如Python 2.x中的unicode对象)
2. 在程序中统一用text来处理
3. 写入I/O操作,先把text转化成binary数据,在写入I/O
当然,Python 3.x在编码这一块处理的比较好,如果题主能够迁移到Python 3.x的环境下,建议先阅读文档中这一部分的内容,很多问题就能迎刃而解了。