0

我通过 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:字符映射必须返回整数、无或 unicode

我想将字符串格式化为“türlich türlich sicher dicker”。

4

1 回答 1

0

这个问题不是一个完整的独立示例;我不能确定它是 Python 2 还是 3,maketrans来自哪里等等。我很有可能会猜错,这就是为什么你应该确保适当地标记你的问题并提供一个简短、自包含、正确的例子. (那个,还有很多其他人——他们中的一些人可能比我聪明——可能忽略了你的问题,因为它是模棱两可的。)

假设您使用的是 2.x,并且您已经完成了from string import *getmaketrans并且json["name"]是 unicode 而不是 str/bytes,这就是您的问题:

有两种翻译表:旧式 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ürlich türlich sicher dicker”

如果你做对了,你将把字符串格式化为“türlich türlich sicher dicker”,因为你将所有这些标点符号映射到空格,而不是什么都没有。

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

于 2012-09-12T23:56:22.410 回答