String.replace() con caratteri speciali che sostituiscono solo alcuni di essi

Aug 22 2020

Ho esaminato molti post diversi sulla sostituzione dei caratteri su questo sito e altri, e ho già eseguito la sostituzione delle stringhe. In questo caso specifico, tuttavia, sto riscontrando un problema imprevisto. Spero di essermi perso qualcosa di ovvio...

Sto cercando di sostituire un elenco di caratteri speciali con i loro codici di entità HTML. Ho provato alcune versioni di questo, dalle sostituzioni di testo in chiaro ( ½a ½) all'ultima iterazione, utilizzando stringhe codificate in byte (come suggerito qui )

La funzionalità del mio codice è piuttosto semplice. Ottengo il contenuto di un file:

with open(cur_file, 'r', encoding='utf-8') as file_handle:
    file_contents = file_handle.read()
file_handle.close()

Poi chiamo la mia funzione 'replacer()':

good_text = replacer(file_contents)

Contenuto della funzione replacer():

def replacer(text):
    replace_chars = {
        b'\xc2\xbd': '½',    #½
        b'\xe2\x80\x9c': '"',  #“
        b'\xe2\x80\x9d': '"',  #”
        b'\xe2\x80\x99': '´', #’
        b'\xe2\x80\x93': '—', #–
        b'\xc2\xa9': '©'       #©
    }
    
    for k, v in replace_chars.items():
        good_text = text.replace(k.decode('utf-8'), v)
        print('replacing ' + k.decode('utf-8') + ' with ' + v)
    return good_text

Quindi salvo il nuovo testo nel file:

    with open(cur_file, 'w', encoding='utf-8') as file_handle:
        file_handle.write(good_text)
    file_handle.close()
    
    print('Done!')

Nella console, eseguo questo e ottengo:

replacing ½ with ½
replacing “ with "
replacing ” with "
replacing ’ with ´
replacing – with —
replacing © with ©
Done!

Questo è come previsto. Tuttavia il file in cui sto sostituendo le stringhe ha i seguenti contenuti:

replace_chars = {
        '½': '½',
        '“': '"',
        '”': '"',
        '’': '´',
        '–': '—',
        '©': '©'

Mi aspetto che il file non contenga ½o gli altri caratteri nella prima colonna, ma sia invece simile a'©': '©'

Risposte

2 Barmar Aug 22 2020 at 05:23

Ogni volta che esegui il ciclo sostituisci dal testo originale, non dal risultato della sostituzione precedente. Quindi il risultato finale è solo l'ultima sostituzione, non tutte.

Cambia il ciclo in modo da memorizzare il risultato nella stessa variabile.

    for k, v in replace_chars.items():
        text = text.replace(k.decode('utf-8'), v)
        print('replacing ' + k.decode('utf-8') + ' with ' + v)
    return text