Вопрос по python, unicode – Python TypeError: ожидал символьный буферный объект, личное недопонимание

4

я застрял в этой ошибке в течение длительного времени:

<code> TypeError: expected a character buffer object
</code>

я просто понимаю, что неправильно понял, это что-то вроде разницы между строкой Unicode и «простой». Строка, я пытался использовать приведенный выше код с & quot; нормальным & quot; Строка, в то время как я должен был передать один Unicode. Так что, подделывая простое «и» перед тем как строка прервала выполнение: / !!!

Кстати, TypeError была очень неясна для меня, и до сих пор.

пожалуйста, можете ли некоторые объяснить мне, что я пропустил и почему "просто" строка НЕ является «объектом буфера символов» ?

Вы можете воспроизвести с кодом ниже (извлечено и (с) изВот: )

<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>

производя:

<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>

Ваш Ответ

1   ответ
12

translate метод строки байта отличается отtranslate метод строки Unicode. Вот строка документации версии, не поддерживающей Юникод:

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.

А вот версия Unicode:

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.

Вы можете видеть, что не-Unicode-версия ожидает "строку длиной 256", тогда как не-Unicode-версия ожидает "mapping" (то есть диктат). Таким образом, проблема не в том, что ваша строка в кодировке Unicode является объектом буфера, а не в кодировке Unicode - это, конечно, оба буфера, но этаtranslate метод ожидает такой объект буфера, а другой - нет.

благодарю вас ! я был очень очень далек от понимания этого! как я не заметил, это был не тот же объект: / user1340802

Похожие вопросы