[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