Avendo capito perché Unicode è necessario (lettura consigliata: link , link : grazie a @DanielB per gli eccellenti link) e che codifiche dei caratteri sono i computer utilizzare per rappresentare i personaggi del mondo reale, diventa chiaro che quando Python sta leggendo o scrivendo byte che rappresentano il testo da un flusso (che può essere un file, una pipe, un socket, ...), ha bisogno di sapere quale codifica dei caratteri è in corso usato in modo che quei byte siano significativi come testo leggibile dall'uomo.
Python utilizza ascii
come codifica predefinita. La codifica ascii
è inadeguata per quasi tutte le lingue (compreso l'inglese: non c'è £
in ascii
!): Quindi devi specificare una codifica alternativa quando scrivi a stream se intendi utilizzare qualsiasi carattere non parte di% % co_de.
Durante la lettura dai flussi, è necessario sapere quale codifica è stata utilizzata per scrivere nello stream e utilizzare la stessa codifica per leggerla, altrimenti il risultato decodificato sarà errato. Prova a scrivere una stringa con caratteri cirillici con il codec ascii
e rileggila con il codec ISO-8859-5
: vedrai che non corrispondono, perché sequenze di byte diverse significano caratteri diversi nelle due codifiche.
Quindi, per rispondere alla tua domanda specifica,
out_file = open('example.txt', 'w')
in realtà sta aprendo il file per la scrittura usando implicitamente il codec UTF-8
. Se vuoi specificare un altro codec, devi utilizzare il parametro ascii
della funzione encoding
in Python 3.x :
out_file = open('example.txt', 'a', 'utf-8')
o se stai ancora utilizzando Python 2.x (l'ultimo è Python 2.7.3 al momento della stesura di questo documento), è necessario utilizzare le funzioni dal codec modulo:
out_file = codecs.open('example.txt', 'a', 'utf-8')
poiché open
in Python 2.x non consente di specificare una codifica ( puoi usarlo per leggere il flusso di byte in una stringa di byte in memoria, e poi decodificare quella stringa).