TypeError:期望使用.translate

时间:2018-09-23 21:14:42

标签: python django python-2.7 unicode translate

我遇到了错误:

  

TypeError:应使用字符缓冲区对象

在显示words=user_input_txt.translate(translate_table).lower().split()的行中。我检查了参数user_input_txt的类型及其类型Unicode。我不确定自己在做什么错,也不太了解以前的帖子。如果有人可以建议如何解决,我将不胜感激!

def contains_bad_words(user_input_txt):
    """ remove punctuation from text 
        and make it case-insensitive"""
    translate_table = dict((ord(char), None) for char in string.punctuation)
    words = user_input_txt.translate(translate_table).lower().split()
    for bad_word in blacklist:
        for word in words:
            if word == bad_word:
                return True
    return False

编辑:根据丹尼尔(Daniel)的建议,我已经修改了解决方案。但是,我现在收到错误:

  

TypeError:maketrans()恰好接受2个参数(给定1个)。

有人可以告诉我我在做什么错吗?我读到string.maketrans可以接受一个论点,只要这是一个命令即可。但是translate_table是字典吗?请帮忙!

def contains_bad_words(user_input_txt):
    """ remove punctuation from text 
        and make it case-insensitive"""
    translate_table = dict((ord(char), None) for char in string.punctuation)
    translate_table_new = string.maketrans(translate_table)
    words = user_input_txt.translate(translate_table_new).lower().split()
    for bad_word in blacklist:
        for word in words:
            if word == bad_word:
                return True
    return False

第二编辑: 因此,我通过将unicode字符串转换为字符串并将参数数量更改为maketrans来解决了该问题。但是,我仍然很困惑为什么上面的解决方案不起作用。我读到某个地方可以带1个参数,前提是它必须是字典,这显然是我所做的。有人可以帮忙解释一下为什么上面的方法不起作用,而下面的方法可以起作用:

def contains_bad_words(user_input_txt):
    """ remove punctuation from text
        and make it case-insensitive"""
    user_typ = user_input_txt.encode()
    translate_table_new = maketrans(string.punctuation, 32*" ")
    words = user_typ.translate(translate_table_new).lower().split()
    for bad_word in blacklist:
        for word in words:
            if word == bad_word:
                return True
    return False

2 个答案:

答案 0 :(得分:1)

您的代码不是完整的示例。输入的内容很重要。

Python 2中有translate的两个版本:str.translateunicode.translate。这是两者的帮助:

>>> help(str.translate)
Help on method_descriptor:

translate(...)
    S.translate(table [,deletechars]) -> string

    Return a copy of the string S, where all characters occurring
    in the optional argument deletechars are removed, and the
    remaining characters have been mapped through the given
    translation table, which must be a string of length 256 or None.
    If the table argument is None, no translation is applied and
    the operation simply removes the characters in deletechars.

>>> help(unicode.translate)
Help on method_descriptor:

translate(...)
    S.translate(table) -> unicode

    Return a copy of the string S, where all characters have been mapped
    through the given translation table, which must be a mapping of
    Unicode ordinals to Unicode ordinals, Unicode strings or None.
    Unmapped characters are left untouched. Characters mapped to None
    are deleted.

如果您有字节字符串(str),则表转换要求必须是长度为256或无的字节字符串。 .translate的可选第二个参数删除字符。

string.maketrans可以生成256字节的字符串。它采用两个必须相同长度的参数。这是帮助:

>>> import string
>>> help(string.maketrans)
Help on built-in function maketrans in module strop:

maketrans(...)
    maketrans(frm, to) -> string

    Return a translation table (a string of 256 bytes long)
    suitable for use in string.translate.  The strings frm and to
    must be of the same length.

演示(a-> 1b-> 2c-> 3,删除def):

>>> import string
>>> test = 'abcdefg'  # byte string in Python 2
>>> test.translate(string.maketrans('abc','123'),'def')
'123g'

unicode版本将Unicode常规词典转换为Unicode常规,Unicode字符串或“无”。

演示(更改a-> bc-> xxx,然后删除d):

>>> test = u'abcdefg' # Unicode string in Python 2
>>> xlat = {ord('a'):ord('b'),ord('c'):u'xxx',ord('d'):None}
>>> test.translate(xlat)
u'bbxxxefg'

因此,对于您的示例,您想要删除标点符号。根据您是字节字符串还是Unicode字符串,选择以下选项之一:

>>> import string
>>> translate_table = dict((ord(char), None) for char in string.punctuation)
>>> u'abcd.,def'.translate(translate_table)
u'abcddef'

>>> import string
>>> 'abcd.,def'.translate(None,string.punctuation)
'abcddef'

答案 1 :(得分:0)

0 <= n < v.size()不能直接接受命令。您需要先通过.translate运行它。

str.maketrans