[Python] insert à in db sqlite3
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
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
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
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
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
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