Questo problema si verifica comunemente quando si passa da py2 a py3. In py2 plaintext
è sia una stringa che un tipo di array di byte . In py3 plaintext
è solo una stringa e il metodo in outfile.write()
realtà accetta un array di byte quando outfile
viene aperto in modalità binaria, quindi viene sollevata un'eccezione. Modificare l'input in plaintext.encode('utf-8')
per risolvere il problema. Continua a leggere se questo ti dà fastidio.
Nel PY2, la dichiarazione per file.write sembrava che avete passato in una stringa: file.write(str)
. In realtà si passavano in un array di byte, si avrebbe dovuto essere la lettura della dichiarazione in questo modo: file.write(bytes)
. Se lo leggi in questo modo il problema è semplice, ha file.write(bytes)
bisogno di un tipo di byte e in py3 per ottenere byte da una str lo converti:
py3>> outfile.write(plaintext.encode('utf-8'))
Perché la dichiarazione dei documenti py2 ha file.write
preso una stringa? Ebbene in py2 la distinzione della dichiarazione non aveva importanza perché:
py2>> str==bytes
True
La classe str-bytes di py2 ha metodi / costruttori che la fanno comportare come una classe stringa in alcuni modi e come una classe array di byte in altri. Comodo perché file.write
non è vero ?:
py2>> plaintext='my string literal'
py2>> type(plaintext)
str
py2>> outfile.write(plaintext)
Perché py3 ha rotto questo bel sistema? Bene, perché in py2 le funzioni di base delle stringhe non funzionavano per il resto del mondo. Misurare la lunghezza di una parola con un carattere non ASCII?
py2>> len('¡no')
4
Per tutto questo tempo hai pensato di chiedere la lunghezza di una stringa in py2, stavi ottenendo la lunghezza dell'array di byte dalla codifica. Quell'ambiguità è il problema fondamentale con le classi a doppio dovere. Quale versione di qualsiasi chiamata di metodo implementate?
La buona notizia quindi è che py3 risolve questo problema. Districa le classi str e bytes . La classe str ha metodi simili a stringhe, la classe byte separata ha metodi array di byte:
py3>> len('¡ok')
3
py3>> len('¡ok'.encode('utf-8'))
4
Si spera che questa conoscenza aiuti a demistificare il problema e renda il problema della migrazione un po 'più facile da sopportare.