在Python中将Unicode映射到ASCII

时间:2012-09-12 23:25:18

标签: python unicode mapping ascii

我通过urlopen以JSON格式查询后收到字符串:

def get_clean_text(text):
    return text.translate(maketrans("!?,.;():", "        ")).lower().strip()

for track in json["tracks"]:
    print track["name"].lower()
    get_clean_text(track["name"].lower())

对于字符串“türlich,türlich(sicher,dicker)”,我接着

  

文件“main.py”,第23行,在get_clean_text

return text.translate(maketrans("!?,.;():", "        ")).lower().strip()
     

TypeError:字符映射必须返回整数,None或unicode

我想将字符串格式化为“türlichtürlichsicherdicker”。

1 个答案:

答案 0 :(得分:0)

问题不是一个完整的自成一体的例子;我无法确定它是Python 2还是3,maketrans来自哪里等等。我很有可能猜错了,这就是为什么你应该确保标记你的问题并提供{{{ 3}}。 (那个,以及其他人 - 其中一些人可能比我聪明 - 可能会忽略你的问题,因为它含糊不清。)

假设你正在使用2.x,而你已经from string import *得到maketransjson["name"]是unicode而不是str / bytes,这就是你的问题:< / p>

有两种转换表:旧式8位表(只是256个字符的数组)和新式稀疏表(它们只是将一个字符的序号映射到另一个字符的dict)。 str.translate函数可以使用其中任何一个,但是unicode.translate只能使用第二个(出于那些原因,如果您稍微考虑一下,这个原因应该很明显)。

string.maketrans函数生成旧式8位转换表。因此,您无法将其与unicode.translate一起使用。

您可以随时编写自己的“makeunitrans”功能作为替代品,如下所示:

def makeunitrans(frm, to):
  return {ord(f):ord(t) for (f,t) in zip(frm, to)}

但是如果你只想绘制某些角色,你可以做一些更特殊的目的:

def makeunitrans(frm):
  return {ord(f):ord(' ') for f in frm}

但是,从您的最终评论来看,我不确定translate是否是您想要的:

  

我想将字符串格式化为“türlichtürlichsicherdicker”

如果你说得对,你要将字符串格式化为“türlichtürlichsicherdicker”,因为你将所有这些标点符号映射到空格,而不是没有。

使用新式转换表,您可以将任何想要的内容映射到None,从而解决该问题。但是你可能想退后一步,问一下为什么你首先使用translate方法,而不是多次调用replace(人们通常会说“为了表现”,但你不会如果这是一个问题,或者使用一个简单的正则表达式,那么每次都要在线构建转换表。