我在很长一段时间内都遇到了这个错误:
TypeError: expected a character buffer object
我只是理解我误解了什么,这是关于unicode字符串和'简单'字符串之间的区别,我试图使用上面的代码和“普通”字符串,而我必须传递一个unicode一。所以在字符串断开执行之前伪造简单的“u”:/ !!!
BTW TypeError对我来说非常不清楚,现在还是。
拜托,有人可以解释一下我错过了什么以及为什么“简单”字符串不是“字符缓冲对象”吗?
您可以使用以下代码进行复制(从here中提取和(c):)
def maketransU(s1, s2, todel=u""):
"""Build translation table for use with unicode.translate().
:param s1: string of characters to replace.
:type s1: unicode
:param s2: string of replacement characters (same order as in s1).
:type s2: unicode
:param todel: string of characters to remove.
:type todel: unicode
:return: translation table with character code -> character code.
:rtype: dict
"""
# We go unicode internally - ensure callers are ok with that.
assert (isinstance(s1,unicode))
assert (isinstance(s2,unicode))
trans_tab = dict( zip( map(ord, s1), map(ord, s2) ) )
trans_tab.update( (ord(c),None) for c in todel )
return trans_tab
#BlankToSpace_table = string.maketrans (u"\r\n\t\v\f",u" ")
BlankToSpace_table = maketransU (u"\r\n\t\v\f",u" ")
def BlankToSpace(text) :
"""Replace blanks characters by realspaces.
May be good to prepare for regular expressions & Co based on whitespaces.
:param text: the text to clean from blanks.
:type text: string
:return: List of parts in their apparition order.
:rtype: [ string ]
"""
print text, type(text), len(text)
try:
out = text.translate(BlankToSpace_table)
except TypeError, e:
raise
return out
# for SO : the code below is just to reproduce what i did not understand
dummy = "Hello,\n, this is a \t dummy test!"
for s in (unicode(dummy), dummy):
print repr(s)
print repr(BlankToSpace(s))
生产:
u'Hello,\n, this is a \t dummy test!'
Hello,
, this is a dummy test! <type 'unicode'> 32
u'Hello, , this is a dummy test!'
'Hello,\n, this is a \t dummy test!'
Hello,
, this is a dummy test! <type 'str'> 32
Traceback (most recent call last):
File "C:/treetaggerwrapper.error.py", line 44, in <module>
print repr(BlankToSpace(s))
File "C:/treetaggerwrapper.error.py", line 36, in BlankToSpace
out = text.translate(BlankToSpace_table)
TypeError: expected a character buffer object
答案 0 :(得分:12)
问题是字节字符串的translate
方法与unicode字符串的translate
方法不同。这是非unicode版本的文档字符串:
S.translate(table [,deletechars]) - &gt;串
返回字符串S的副本,其中包含所有字符 在可选参数中删除deletechars,并且 剩余的字符已通过给定的映射 转换表,必须是长度为256的字符串。
这是unicode版本:
S.translate(表) - &gt;的unicode
返回字符串S的副本,其中所有字符都已映射 通过给定的转换表,它必须是映射 Unicode序列,Unicode序列,Unicode字符串或无。 未映射的字符保持不变。映射到无的字符 被删除。
你可以看到非unicode版本期望“长度为256的字符串”,而非unicode版本期待“映射”(即字典)。所以问题不在于你的unicode字符串是一个缓冲区对象,而非unicode字符串不是 - 当然,两者都是缓冲区 - 但是一个translate
方法期望这样一个缓冲区对象而另一个不是'吨。