2017-06-21 39 views
0

Ich bin nicht in der Lage, herauszufinden, was dieser Fehler ist und wie ich es beheben kann.TypeError: Zeichenmapping muss Integer, None oder Unicode zurückgeben

texts = [[word for word in document.translate(trans_table).lower().split()] for document in live_text] 

TypeError: character mapping must return integer, None or unicode 

Mein Code:

rows=cursor.fetchall() 
listTSeps=[] 

for row in rows: 
    listTSeps.append(re.sub('[^A-Za-z0-9]+', ' ', row[0])) 

#Close cursor and connection done reading from database 
cursor.close() 
conn.close() 


live_text=listTSeps 
trans_table = ''.join([chr(i) for i in range(128)] + [' '] * 128) 

texts = [[word for word in document.translate(trans_table).lower().split()] for document in live_text] 

text_matrix = ["None"]*len(live_text) 

durch web Meine Suche ergab, dass diese .encode Verwendung gelöst werden können ('ascii') oder ord().

Ich bin ein Amateur mit Python und versuchen, von Beispielcodes zu lernen. Ich habe das von einem Freund erfahren. Könnte jemand bitte freundlich genug sein, die Ursache des Problems zu erklären und wie repariere ich es? Vielen Dank.

+0

Bei was Linie wirft es den Fehler? –

+0

Hier: texts = [[Wort für Wort in document.translate (trans_table) .lower(). Split()] für Dokument in live_text] –

+1

Was ist Ihre Version von Python? Python 3.0 bis 3.3 erlaubte keine Zeichenkette für die Übersetzungstabelle, sondern benötigte eine Karte. –

Antwort

1

Ihr document ist ein unicode, kein str. Für unicode muss die translate()-Methode etwas anderes sein, nicht eine Zeichenfolge mit 256 Zeichen.

help(u' '.translate) 

ergibt:

Help on built-in function translate: 

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. 

Ein Wörterbuch wie das ist in Ordnung:

u'abcd efgh'.translate({ 32: u'x' }) 
u'abcdxefgh' 

Für Ihren Fall, in dem Sie nur alle Zeichen mit einem Raum oberhalb ASCII 127 ersetzen möchten, können Sie möchte dies berücksichtigen:

re.sub(r'[^\x00-\x7f]', ' ', u'abcdäefgh') 
u'abcd efgh' 
Verwandte Themen