[Python] PIL save
Marco Buttu
mbuttu a oa-cagliari.inaf.it
Ven 27 Dic 2013 07:25:42 CET
On 12/26/2013 08:13 PM, Daniele Zambelli wrote:
> p.save('esagono')
> [...]
>
> il metodo viene eseguito sotto Python 2.7 funziona, qundo lo
> eseguo sotto Python 3.3 ottengo:
>
> Traceback (most recent call last):
> ...
> gs.write(s)
> TypeError: must be str, not bytes
>
> Qualcuno saprebbe darmi qualche indicazione per risolvere il caso?
Ciao Daniele, il file e' aperto in modo testuale, mentre s e' una
stringa di byte. Questo in Python 3 da luogo ad un errore, perche'
caratteri Unicode e byte, ovviamente, non devono, e quindi non possono,
essere confusi:
>>> f = open('myfile', 'w').write(b'foooo')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be str, not bytes
Il letterale b'foooo' e' una stringa di byte in Python 3. Infatti in
Python 3 le stringhe possono essere di byte o di caratteri Unicode:
>>> s1 = 'ciao'
>>> s2 = b'ciao'
>>> type(s1), type(s2)
(<class 'str'>, <class 'bytes'>)
>>> len('è')
1
>>> [i for i in 'è']
['è']
Nel tuo codice non hai avuto problemi usando Python 2 perche' purtroppo
il problema sta a monte, nel senso che il problema e' Python 2, dove il
tipo str crea una sorta di istanza promiscua di byte e testo:
>>> s = 'è'
>>> len(s)
2
>>> s
'\xc3\xa8'
Per creare una stringa di testo in Python 2 si usa il tipo unicode:
>>> s = unicode('è', encoding='utf-8')
>>> len(s)
1
Ciao, Marco
--
Marco Buttu
INAF-Osservatorio Astronomico di Cagliari
Via della Scienza n. 5, 09047 Selargius (CA)
Phone: 070 711 80 217
Email: mbuttu a oa-cagliari.inaf.it
Maggiori informazioni sulla lista
Python