我通过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”。
答案 0 :(得分:0)
问题不是一个完整的自成一体的例子;我无法确定它是Python 2还是3,maketrans
来自哪里等等。我很有可能猜错了,这就是为什么你应该确保标记你的问题并提供{{{ 3}}。 (那个,以及其他人 - 其中一些人可能比我聪明 - 可能会忽略你的问题,因为它含糊不清。)
假设你正在使用2.x,而你已经from string import *
得到maketrans
,json["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
(人们通常会说“为了表现”,但你不会如果这是一个问题,或者使用一个简单的正则表达式,那么每次都要在线构建转换表。