Python TypeError: esperaba un objeto de búfer de caracteres, malentendido personal
Me quedé atascado en este error durante mucho tiempo:
<code> TypeError: expected a character buffer object </code>
acabo de entender lo que he entendido mal, es algo acerca de la diferencia entre una cadena Unicode y una cadena 'simple', he intentado usar el código anterior con una cadena "normal", mientras que tuve que pasar uno unicode. Así que olvidando la simple "u" antes de que la cadena rompiera la ejecución: / !!!
Por cierto, el TypeError no estaba muy claro para mí, y sigue siendo.
por favor, ¿puede alguien explicarme lo que me faltaba y por qué una cadena "simple" NO es un "objeto de búfer de caracteres"?
puede reproducir con el siguiente código (extraído y (c) deaquí:)
<code>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)) </code>
produciendo
<code>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 </code>