[Python] insert à in db sqlite3

2010-08-31 Per discussione Vittorio Zuccala'
Buongiorno a tutti,
è sicuramente una cosa banale ma sto sbattendo la testa sul seguente
problema:

* dal nostro gestionale recupero un file CSV con lettere accentate,
apostrofi e quant'altro.
* devo importare il tutto in un file sqlite

Utilizzo il seguente codice (è una prova quindi non badate alle finezze):

*import sqlite3
import os
import csv

con=sqlite3.connect('dbe.sqlite')
cur=con.cursor()

try:
cur.execute('DROP TABLE cqrep000f')
except:
pass

cur.execute('''
CREATE  TABLE cqrep000f (
# segue una cinquantina di campi
)
''')
con.commit()

f = open('cqrep.csv')

csv_reader = csv.reader(f, delimiter=';', quotechar = '')

for row in csv_reader:
l=len(row)
for i in range(l):
row[i]=unicode(row[i])

cur.execute('INSERT INTO cqrep000f VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', row)
con.commit()

cur.close()
con.close(*)

Tutto funziona finchè non incontra lettere con accenti, apostrofi o cose
strane.
L'errore che mi restituisce è il seguente:

*row[i]=unicode(row[i])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 4:
ordinal not in range(128)
*

Come posso ovviare il problema?
Grazie per gli aiuti.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] insert à in db sqlite3

2010-08-31 Per discussione Antonio Cangiano

 Tutto funziona finchè non incontra lettere con accenti, apostrofi o cose
 strane.


Ciao Vittorio,

devi specificare l'encoding altrimenti ASCII è usato di default e unicode()
restituisce un errore se incontra un carattere il cui codice è maggiore di
127.

Puoi usare unicode(row[i], utf_8) ad esempio.

Ciao,
Antonio
-- 
Homepage: http://antoniocangiano.com
High-Quality Programming Screencasts: http://thinkcode.tv
Receive weekly updates about new books covering the subjects you love:
http://anynewbooks.com
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] insert à in db sqlite3

2010-08-31 Per discussione Andrea Spadaccini
Ciao Vittorio,

[cut]

 * dal nostro gestionale recupero un file CSV con lettere accentate,
 apostrofi e quant'altro.

[cut]

Non so se sia questo il problema, ma nella documentazione del modulo csv 
(http://docs.python.org/library/csv.html) c'è scritto:

This version of the csv module doesn’t support Unicode input.

Nella sezione Examples della stessa documentazione c'è una versione Unicode.

HTH,
Andrea
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] insert à in db sqlite3

2010-08-31 Per discussione Daniele Varrazzo
On Tue, 31 Aug 2010 17:23:00 +0200, Vittorio Zuccala'
vittorio.zucc...@gmail.com wrote:

 Tutto funziona finchè non incontra lettere con accenti, apostrofi o cose
 strane.

Questa frase ha una certa universalità :)


 L'errore che mi restituisce è il seguente:
 
 *row[i]=unicode(row[i])
 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 4:
 ordinal not in range(128)

Benvenuto nel magico mondo degli encoding. Il problema si limita a questo,
non dipende da sqlite.


 Come posso ovviare il problema?

1. devi *sapere* quale è l'encoding originale di row[i]. Se non lo sai,
hai poche speranze di fare qualunque cosa (leggi
http://www.joelonsoftware.com/articles/Unicode.html per una rapida
introduzione)
2. se row[i] è una stringa (oggetto 'str') e se l'encoding è latin1, puoi
usare row[i] = row[i].decode('latin1')
3. se l'encoding è quasi sempre latin1, ovvero ti aspetti che a monte
abbiano fatto degli errori, puoi usare:

 row[i].decode('latin1', 'replace')

così almeno se in input viene passato un carattere illegale in output
viene sostituito da ? invece che tirare un'eccezione.

4. latin1, latin9, cp1252 sono orrendamente simili: non credere di sapere
quale sia il tuo encoding finché non hai visto un carattere euro; nel
frattempo meglio usare la ricetta in 3.

-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] insert à in db sqlite3

2010-08-31 Per discussione Vittorio Zuccala'
Il giorno 31 agosto 2010 18:01, Daniele Varrazzo p...@develer.com ha
scritto:

 Benvenuto nel magico mondo degli encoding. Il problema si limita a questo,
 non dipende da sqlite.



Guarda me ne sono sempre tenuto fuori per antipatia
L'encoding mi ha sempre fatto venire l'orticaria ma mi sa che devo
approfondire il discorso.


1. devi *sapere* quale è l'encoding originale di row[i]. Se non lo sai,
 hai poche speranze di fare qualunque cosa (leggi
 http://www.joelonsoftware.com/articles/Unicode.html per una rapida
 introduzione)



Inizierò da questo articolo. Grazie



 2. se row[i] è una stringa (oggetto 'str') e se l'encoding è latin1, puoi
 usare row[i] = row[i].decode('latin1')
 3. se l'encoding è quasi sempre latin1, ovvero ti aspetti che a monte
 abbiano fatto degli errori, puoi usare:



Sono impressionato.
Ha funzionato.
Prima mi leggo l'articolo poi farò ulteriori domande perchè davvero non
riesco a capirne il meccanismo :-)



 4. latin1, latin9, cp1252 sono orrendamente simili: non credere di sapere
 quale sia il tuo encoding finché non hai visto un carattere euro; nel
 frattempo meglio usare la ricetta in 3.



Latin1, latin9 e cp1252 mi ero accorto fossero quasi identici da quando
utilizzo LaTeX ma per il resto ho sempre snobbato il discorso.
Per il momento ti ringrazio.
A presto per ulteriori domande in merito :-)
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] insert à in db sqlite3

2010-08-31 Per discussione Vittorio Zuccala'
Il giorno 31 agosto 2010 17:38, Antonio Cangiano acangi...@gmail.com ha
scritto:


 Puoi usare unicode(row[i], utf_8) ad esempio.





Purtroppo non funziona.
Mi da il seguente errore:

 *row[i]=unicode(row[i], utf_8)
File c:\python26\lib\encodings\utf_8.py, line 16, in decode
return codecs.utf_8_decode_(input, erroprs, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe0 in position 4-6:
invadil data*

Precedentemente era:
*row[i]=unicode(row[i])*
*UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 4:
ordinal not in range(128)*
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python