[Python] Domanda facile facile su caso manipolazione unicode
Giovanni Porcari
giovanni.porcari a softwell.it
Gio 29 Gen 2015 08:09:40 CET
> Il giorno 28/gen/2015, alle ore 18:15, Marco Ippolito <ippolito.marco a gmail.com> ha scritto:
>
> Ciao a tutti,
>
> ho messo in file json alcune possibili sostituzioni di simboli
> all'interno di un testo:
> "to_substitute":{
> "“": "'",
> "”": "'",
> "—": "-",
> "’": "'",
> "è": "e'",
> "é": "e'"
> }
>
> facendo così:
> self.extracted_text_u = self.extracted_text_u.replace("“",
> self.textManipulation["to_substitute"][unicode("“", "utf-8")])
> self.extracted_text_u = self.extracted_text_u.replace("”",
> self.textManipulation["to_substitute"][unicode("”", "utf-8")])
> self.extracted_text_u = self.extracted_text_u.replace("—",
> self.textManipulation["to_substitute"][unicode("—", "utf-8")])
> self.extracted_text_u = self.extracted_text_u.replace("’",
> self.textManipulation["to_substitute"][unicode("’", "utf-8")])
> self.extracted_text_u = self.extracted_text_u.replace("è",
> self.textManipulation["to_substitute"][unicode("è", "utf-8")])
> self.extracted_text_u = self.extracted_text_u.replace("é",
> self.textManipulation["to_substitute"][unicode("é", "utf-8")])
>
> sostituisco all'interno di un testo alcuni simboli con il
> corrispettivo messo nel file json.
>
> Ma questa soluzione, pur funzionando, non è granchè....
> per cui ho importato le coppie simbolo-sostituto in un dictionary:
> self.to_substitute_dictionary = self.textManipulation["to_substitute"]
> {u'\xe9': "e'", u'\xe8': "e'", u'\u2014': '-', u'\u2019': "'",
> u'\u201d': "'", u'\u201c': "'"}
>
> for k, v in self.to_substitute_dictionary.iteritems():
> print k, v
> é e'
> è e'
> — -
> ’ '
> ” '
> “ '
>
> Quando invece faccio:
> for k, v in self.to_substitute_dictionary.iteritems():
> self.extracted_text_u = self.extracted_text_u.replace(k, v)
>
> File "extract_sentences.py", line 56, in sentences_extraction_meth
> self.extracted_text_u = self.extracted_text_u.replace(k, v)
> UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position
> 16: ordinal not in range(128)
>
> E se faccio:
> for k, v in self.to_substitute_dictionary.iteritems():
> v_u = unicode(v, "utf-8")
> self.extracted_text_u = self.extracted_text_u.replace(k, v_u)
>
> self.extracted_text_u = self.extracted_text_u.replace(k, v_u)
> UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position
> 16: ordinal not in range(128)
>
>>>> for k, v in to_substitute_dictionary.iteritems():
> ... v_u = unicode(v, "utf-8")
> ... print "(type(k), type(v_u))= ", (type(k), type(v_u))
> ...
> (type(k), type(v_u))= (<type 'unicode'>, <type 'unicode'>)
> (type(k), type(v_u))= (<type 'unicode'>, <type 'unicode'>)
> (type(k), type(v_u))= (<type 'unicode'>, <type 'unicode'>)
>
> Deve essere una stupidata.....qualche consiglio?
>
> Marco
Butto lì una soluzione rapida ...
#-*- coding: UTF-8 -*-
import re
chardict={u"“": "'",
u"”": "'",
u"—": "-",
u"’": "'",
u"è": "e'",
u"é": "e'"}
SUBS=re.compile(u"([%s])" %'|'.join(chardict.keys()))
s=u"Mario disse “non so perché non so chi è” "
print SUBS.sub(lambda m:chardict[m.group(1)],s)
>>>Mario disse 'non so perche' non so chi e''
Spero ti sia utile.
Ciao
G
Maggiori informazioni sulla lista
Python