Newsgroup: it.comp.lang
Titolo: [PYTHON] Scrittura di file binaria

Leggendo la documentazione non sono riuscito a capire come si fa ad
aprire un file e scriverci un byte.
Con struct in realta' scrivo in un formato, e con l'oggetto file
builtin posso scrivere solo stringhe con caratteri il cui valore
numerico va da 0 a 128 (quindi senza mai il bit piu' significativo
settato).
Il problema e' che vorrei scrivere (e magari poi leggere) le lettere
accentate nei file.
-- 
sito papero -> 
http://utenti.tripod.it/papero

 accentate nei file.
E il codice che hai provato a questo scopo e`...?
Alex

E il codice che hai provato a questo scopo e`...?
Leggo da un DB del testo.
Questa e' la parte tralasciabile di lettura:
++++
import win32com.client
def GetRow(query):
    ris = []
    conn = win32com.client.Dispatch('ADODB.Connection')
    conn.Provider = "sqloledb"
    ProvStr = "Server=mio_pc;Database=bho;UID=sa;pwd=mia_password;"
    conn.Open(ProvStr)
    rs = win32com.client.Dispatch('ADODB.Recordset')
    rs.Open(query , conn)
    if rs.BOF == 0:
        rs.MoveFirst()
        while 1:
            if rs.EOF:
                break
            riga = []
            for i in range(0, rs.Fields.Count):
                riga.append( rs.Fields.Item(i).Value )
            ris.append( riga )
            rs.MoveNext()
    rs.Close()
    conn.Close()
    return ris
++++
se pero' provo a scrivere su file queste righe :
rw = GetRow("SELECT [testo] FROM [mia_tabella]")
f = open(r'C:\clienti\usl\python\parole.txt','w')
for s in parole:
	f.write(s[0])
f.close()
alla prima parola con una lettera accentata ottengo:
UnicodeError: ASCII encoding error: ordinal not in range(128)
e qui non riesco a capire cosa devo fare.
Scrivere un byte alla volta mi sembra eccessivo.
Sono certo che la colpa e' mia che non faccio la cosa giusta,
pero' continuo a perdermi in questo bicchiere d'acqua.


 e qui non riesco a capire cosa devo fare.
Devi dire a Python come vuoi convertire l'Unicode che stai
scrivendo, cioe` con quale codifica.  Per default si usa la
codifica ASCII, valida solo per i caratteri da 0 a 127, in
quanto e` l'unica parte del range Unicode ad essere comune
a tutte le codifiche in uso.  Non so (dipende dal tuo
sistema) se vuoi usare codifiche 'cp-1252', altre codepage
Microsoft, 'latin-1', 'iso-8859-15', o altre ancora: il
punto e` che neppure Python lo sa, e si rifiuta di tirare
a indovinare, devi dirlo esplicitamente.  Meglio esplicito
che implicito, e` uno dei criteri di progetto di Python.
Cambia dunque la riga con la chiamata a f.write a:
    f.write(s[0].encode('iso-8859-15'))
o simile.  Puoi anche modificare il file site.py della
tua istallazione di Python (lo trovi nel directory della
libreria Python) per cambiare il codec di default della
tua istallazione da 'ascii' a qualcosa d'altro, ma, in
questo caso, ATTENZIONE!, se mai vuoi trasferire i tuoi
programmi ad altre istallazioni che usano altri codec...
Alex

o simile. 
SuperOttimo. E' esattamente cio' che cercavo.
Adesso ho superato questo scoglio.
Devo dire che nella documentazione avevo visto
il capitoletto codec, ma non avevo capito minimamente
come usarli (e la curiosita' mi e' rimasta). 
Una rapida ricerca con google non mi aveva portato consiglio.
Grazie della dritta.


>>
qui come vedi non occorre la chiamata a encode e la
specifica del nome del codec a ogni f.write -- e` comodo
soprattutto se chiami f.write in vari punti.  Con la
lettura "nuda" finale mostro che la codifica e` corretta
(visto che il mio terminale, KDE Konsole, usa iso-8859-1).
Alex