python2.7读取DataFrame中的中文出现问题

发布于 2021-11-29 05:32:42 字数 1573 浏览 857 评论 6

                  name    industry    area       pe  outstanding    
code                                                                                                                                                                  
000001   平安银行       银行   深圳     7.51   1180405.50

....

 

比如上面的df,我读取平安银行,df.loc['000001','name']

却得到'xe5xb9xb3xe5xaex89xe9x93xb6xe8xa1x8c'

我也试了用encode,decode各种转,但是就是转不成中文...

我用的是python2.7,windos7

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

画骨成沙 2021-12-01 19:39:40

你是不是直接拷贝我的代码粘贴到Python交互环境中实验的?如果是,拷贝过程中,已经出问题了,请不要这样,请自己输入。

夜无邪 2021-12-01 18:30:28

具体编码知识,维基百科就够了。

灵芸 2021-12-01 11:24:49

回复
谢谢!

筱武穆 2021-12-01 07:55:09

引用来自“邱Sir”的评论

不明白题主说的“转不成中文”是什么意思。

在Windows 7简体中文环境下,默认标准输出(就是运行cmd命令后的窗口)中的默认字符编码是CP936(绝大部分字符集和GBK兼容),要用Python 2.x的print语句(或者函数)在标准输出中输出中文字符,可以:

1. 用print输出已经用CP936编码过的str对象;

2. 直接用print输出unicode对象。

例子如下:

Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:40:30) [MSC v.1500 64 bit (
AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> us = u'平安银行'
>>> type(us)
<type 'unicode'>
>>> print us
平安银行
>>> s_cp936 = us.encode('cp936')
>>> s_cp936
'xc6xbdxb0xb2xd2xf8xd0xd0'
>>> type(s_cp936)
<type 'str'>
>>> print s_cp936
平安银行
>>>

如果我们把us进行非标准输出的编码,如UTF-8,则编码过程是正常,但是用print输出就会乱码,如下:

>>> s_u8 = us.encode('utf8')
>>> s_u8
'xe5xb9xb3xe5xaex89xe9x93xb6xe8xa1x8c'
>>> print s_u8
骞冲畨閾惰

这是因为,在上面的例子中,用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的环境下,建议先阅读文档中这一部分的内容,很多问题就能迎刃而解了。

秉烛思 2021-12-01 07:04:17

合情合理!

爱的故事 2021-11-30 16:48:30

不明白题主说的“转不成中文”是什么意思。

在Windows 7简体中文环境下,默认标准输出(就是运行cmd命令后的窗口)中的默认字符编码是CP936(绝大部分字符集和GBK兼容),要用Python 2.x的print语句(或者函数)在标准输出中输出中文字符,可以:

1. 用print输出已经用CP936编码过的str对象;

2. 直接用print输出unicode对象。

例子如下:

Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:40:30) [MSC v.1500 64 bit (
AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> us = u'平安银行'
>>> type(us)
<type 'unicode'>
>>> print us
平安银行
>>> s_cp936 = us.encode('cp936')
>>> s_cp936
'xc6xbdxb0xb2xd2xf8xd0xd0'
>>> type(s_cp936)
<type 'str'>
>>> print s_cp936
平安银行
>>>

如果我们把us进行非标准输出的编码,如UTF-8,则编码过程是正常,但是用print输出就会乱码,如下:

>>> s_u8 = us.encode('utf8')
>>> s_u8
'xe5xb9xb3xe5xaex89xe9x93xb6xe8xa1x8c'
>>> print s_u8
骞冲畨閾惰

这是因为,在上面的例子中,用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的环境下,建议先阅读文档中这一部分的内容,很多问题就能迎刃而解了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文