【问题标题】:Python and cyrillic alphabetPython 和西里尔字母
【发布时间】:2015-08-12 15:20:06
【问题描述】:

我正在通过 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 "привет"
привет

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

【问题讨论】:

  • u'\u0410\u0431\u0445\u0430\u0437\u0438\u044f' 是一个 unicode str,所以它确实包含一个单词,这没有问题。
  • 有没有办法让这样的单词可读?
  • 嗯,这主要取决于您的解释器(它是一个 unicode 字符串,所以您的解释器可能无法“识别”它)...使用IPython (3.4) QT Console,如果我运行它,您的代码会输出单词Windows 命令行,我得到和你一样的输出。你真的想用这些线做什么?
  • 我想整理数据,计算一些统计数据并创建一个数据透视表。如果无法读取表格中的信息,将很难做到。
  • @YKY:您使用的是 Python 2 还是 Python 3?你真的需要提到 Unicode 问题,因为 Python 3 中的 Unicode 处理与 Python 2 中的处理完全不同。FWIW,像 '\u0410' 这样的东西被称为 Unicode 转义序列。跨度>

标签: python python-2.7 pandas ipython


【解决方案1】:

这是转换字符串列表以使其在 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 Грузия Грузия

【讨论】:

  • 感谢您的详细回答。我现在会坚持使用转换功能。顺便说一句,如果我决定将来切换到 python 3 对 unicode 有帮助吗?
【解决方案2】:

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

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

【讨论】:

  • 如果我无法找到更好的解决方案,我将不得不这样做。我将不得不按摩这张桌子很长一段时间。而且单独打印每条记录会很不方便。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2018-06-02
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多