Python和西里尔字母

时间:2015-08-12 15:20:06

标签: python python-2.7 pandas ipython

我正在通过ipython使用pandas处理excel表。表包含西里尔字。当我试图挖掘数据时,我总是得到一串数字而不是单词。它看起来像这样:

In [16]: report_sorted_geo['country'].unique()
Out[16]: 
array([u'\u0410\u0431\u0445\u0430\u0437\u0438\u044f',
       u'\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d',
       u'\u0410\u0440\u043c\u0435\u043d\u0438\u044f',
       u'\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u044c',
       u'\u0412\u044c\u0435\u0442\u043d\u0430\u043c',
       u'\u0413\u0432\u0430\u0442\u0435\u043c\u0430\u043b\u0430',
       u'\u0413\u0435\u0440\u043c\u0430\u043d\u0438\u044f',
       u'\u0413\u043e\u043d\u043a\u043e\u043d\u0433',
       u'\u0413\u0440\u0443\u0437\u0438\u044f',

有解决方法吗?

当我只是尝试打印输出时,输出正常:

In [17]: print "привет"
привет

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

这是转换字符串列表以使其在Python 2中更易读的一种方法。此代码显式地将Unicode数据编码为utf-8字节。

#!/usr/bin/env python

data = [
    u'\u0410\u0431\u0445\u0430\u0437\u0438\u044f',
    u'\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d',
    u'\u0410\u0440\u043c\u0435\u043d\u0438\u044f',
    u'\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u044c',
    u'\u0412\u044c\u0435\u0442\u043d\u0430\u043c',
    u'\u0413\u0432\u0430\u0442\u0435\u043c\u0430\u043b\u0430',
    u'\u0413\u0435\u0440\u043c\u0430\u043d\u0438\u044f',
    u'\u0413\u043e\u043d\u043a\u043e\u043d\u0433',
    u'\u0413\u0440\u0443\u0437\u0438\u044f',
]

def list_to_utf8(seq):
    t = ["    u'%s'" % s.encode('utf-8') for s in seq]
    return '[\n' + ',\n'.join(t) + '\n]'

print list_to_utf8(data)

<强>输出

[
    u'Абхазия',
    u'Азербайджан',
    u'Армения',
    u'Беларусь',
    u'Вьетнам',
    u'Гватемала',
    u'Германия',
    u'Гонконг',
    u'Грузия'
]

要在Python代码中使用此数据,必须在脚本顶部提供有效的utf-8编码声明,并且还必须告诉文本编辑器使用utf保存文件-8编码。

<强>测试

#!/usr/bin/env python
# -*- coding: utf_8 -*- 

data = [
    u'\u0410\u0431\u0445\u0430\u0437\u0438\u044f',
    u'\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d',
    u'\u0410\u0440\u043c\u0435\u043d\u0438\u044f',
    u'\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u044c',
    u'\u0412\u044c\u0435\u0442\u043d\u0430\u043c',
    u'\u0413\u0432\u0430\u0442\u0435\u043c\u0430\u043b\u0430',
    u'\u0413\u0435\u0440\u043c\u0430\u043d\u0438\u044f',
    u'\u0413\u043e\u043d\u043a\u043e\u043d\u0433',
    u'\u0413\u0440\u0443\u0437\u0438\u044f',
]

newdata = [
    u'Абхазия',
    u'Азербайджан',
    u'Армения',
    u'Беларусь',
    u'Вьетнам',
    u'Гватемала',
    u'Германия',
    u'Гонконг',
    u'Грузия'
]

for s1, s2 in zip(data, newdata):
    print s1 == s2, s1, s2    

<强>输出

True Абхазия Абхазия
True Азербайджан Азербайджан
True Армения Армения
True Беларусь Беларусь
True Вьетнам Вьетнам
True Гватемала Гватемала
True Германия Германия
True Гонконг Гонконг
True Грузия Грузия

答案 1 :(得分:1)

由于您的终端支持它,为什么不只是print数组的每个元素,让Python处理字形:

In [49]: for e in a:
   ....:     print e
   ....:     
Абхазия
Азербайджан
Армения
Беларусь
Вьетнам
Гватемала
Германия
Гонконг
Грузия