我使用库unidecode将带重音符号的字符串转换为以ascii表示的字母。
>>> accented_string = u'Málaga'
# accented_string is of type 'unicode'
>>> import unidecode
>>> unidecode.unidecode(accented_string)
>>> Malaga
但是问题是我正在从文件中读取字符串,如何将其发送到'unidecode'库。
for name in strings:
print unidecode.unidecode(u+name) #?????
我无法解决这个问题?如果我对它进行编码,只会给我错误的编码。
答案 0 :(得分:1)
我们仍然不知道您的pandas列的类型,因此这是Python 2的两个版本:
如果strings
已经是Unicode字符串序列(type(name)
是unicode
):
for name in strings:
print unidecode.unidecode(name)
如果strings
的元素是常规Python 2 str
(type(name)
是str
):
for name in strings:
print unidecode.unidecode(name.decode("utf-8"))
如果您的字符串以UTF-8编码存储,这将起作用。否则,您将必须提供适当的编码,例如"latin-1"
等
在Python 3中,第一个版本应该可以运行;您必须先解决编码问题,然后才能开始操作,即,当您第一次从磁盘读取数据时。
答案 1 :(得分:1)
我有一个解决方法,它太简单了,只需将读取的字符串解码回unicode字符串,然后将其传递给“ unidecode”库即可。
>>> accented_string = 'Málaga'
>>> accented_string_u = accented_string.decode('utf-8')
>>> import unidecode
>>> unidecode.unidecode(accented_string_u)
>>> Malaga
答案 2 :(得分:0)
accented_string = u"Málaga"
unicodedata.normalize( "NFKD", accented_string ).encode( "ascii", "ignore" )
您可以使用4种规范化形式:“ NFC”,“ NFKC”,“ NFD”和“ NFKD”。
以下是上面链接的文档中使用它的详细信息:
Unicode标准基于规范对等和兼容性对等的定义,定义了Unicode字符串的各种规范化形式。在Unicode中,可以用各种方式表示几个字符。例如,字符U + 00C7(带有CEDILLA的拉丁文大写字母C)也可以表示为序列U + 0043(拉丁文的大写字母C)U + 0327(合并CEDILLA)。
对于每个字符,有两种规范形式:规范形式C和规范形式D。规范形式D(NFD)也称为规范分解,将每个字符转换为其分解形式。普通形式C(NFC)首先应用规范分解,然后再次组成预组合字符。
除了这两种形式,还有两种基于兼容性对等的普通形式。在Unicode中,支持某些字符,这些字符通常会与其他字符统一。例如,U + 2160(罗马数字ONE)与U + 0049(拉丁大写字母I)实际上是同一回事。但是,Unicode支持它以与现有字符集(例如gb2312)兼容。
正常形式的KD(NFKD)将应用兼容性分解,即以所有等效字符替换它们的等效字符。范式KC(NFKC)首先应用兼容性分解,然后进行规范组合。
即使对两个unicode字符串进行了归一化处理并使其与人类阅读器看起来相同,即使其中一个具有组合字符,而另一个却没有,则它们可能不相等。