我收到错误:
类型错误:需要字符缓冲区对象
在它说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
编辑:我已经根据丹尼尔的建议修改了我的解决方案。 但是,我现在收到错误:
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
您的代码不是完整的示例。 您的输入很重要。
Python 2 中有两个版本的translate
:str.translate
和unicode.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 或 None 的字节字符串。 用于.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
->1
,b
->2
,c
->3
, 删除d
,e
和f
(:
>>> import string
>>> test = 'abcdefg' # byte string in Python 2
>>> test.translate(string.maketrans('abc','123'),'def')
'123g'
unicode
版本将 Unicode 序号字典转换为 Unicode 序号、Unicode 字符串或 None。
演示(更改a
->b
、c
->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'
.translate
不直接接受字典。您需要先通过str.maketrans
运行它。
translate_table = dict((ord(char), None) for char in string.punctuation)
translate_table = str.maketrans(translate_table)
words = user_input_txt.translate(translate_table).lower().split()