<div dir="ltr">se non ti piace il pop potresti cambiare <br><div dir="ltr"> kwargs = {columns[c.column]: c.value for c in row} <br></div><div dir="ltr">in </div><div dir="ltr"><br><span style="font-size:13.1999998092651px;line-height:13.1999998092651px"> kwargs = {</span><div><span style="font-size:13.1999998092651px;line-height:13.1999998092651px"> columns[c.column]: c.value </span></div></div><div dir="ltr"><div><span style="font-size:13.1999998092651px;line-height:13.1999998092651px"> for c in row<br> if c.column is not None} <br></span><br><br>non mi è chiara una cosa: come finisce quel None nel descrittore delle colonne dell'xslx/db?</div></div><br><div class="gmail_quote">Il giorno lun 20 apr 2015 alle ore 14:19 Marco De Paoli <<a href="mailto:depaolim@gmail.com" target="_blank">depaolim@gmail.com</a>> ha scritto:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div><div><div><div><div><div>dopo il talk di Alex su codice pythonico/idiomatico...<br></div>beh, non posso lasciar passare il seguente caso senza chiedervi un opinione<br></div><div><br></div>dunque il caso è questo<br></div>ho un file Excel xlsx con righe da caricare una a una su DB<br><br></div><div>non consigliatemi di utilizzare un ETL, perchè non è questo il punto<br></div><div>ah, a proposito, ho scoperto che per mangeggiare i file xlsx, openpyxl va alla grande<br></div><div><br></div><div>tornando a noi...<br></div>la prima riga dell'xlsx è un intestazione che stabilisce i nomi dele colonne<br><br></div>avevo chiesto che usassero i nomi uno a uno con i nomi dei campi su db.<br>ma, no, sarebbe stato troppo semplice e logico, per cui i nomi sono a dir poco fantasiosi e volatili<br><br></div><div>Indi per cui ho un dict che rimappa nomi-colonne-xlsx con nomi-campi-db<br><br></div><div>XLSX_COLUMN_NAMES = {<br></div><div> 'IL nome' : 'name',<br></div><div> 'RIFERIMENTO a GIGIO': 'gigio_id',<br>}<br></div><div><br></div>il piano per il caricamento dati è il seguente: iterare sulle righe dell'xlsx, costruire un kwargs, fare l'insert<br></div><div>abbastanza KISS, insomma<br></div><br>ok, show me the code!<br><br> import openpyxl as pyx<br></div><div> from .models import MyModel</div><div><br> CN = XLSX_COLUMN_NAMES<br><br></div><div></div><div> wb = pyx.load_workbook("sample.xlsx")) <br> ws = wb['DB']<br> columns = {c.column: CN.get(c.value) for c in ws.rows[0]} <br> <br> MyModel.objects.all().delete() <br> for row in ws.rows[1:]: <br> kwargs = {columns[c.column]: c.value for c in row} <br> kwargs.pop(None) <br> MyModel(**kwargs).save() <br><br><br></div><div>le istruzioni per il db sono per django, e per di più sono un po' niubbe (nel senso che si poteva fare qualcosa di più bulk)<br></div><div>ma non è la parte importante: non fanno altro che cancellare tutti i record e poi inserirli uno per uno<br><br></div><div>E' quel kwargs.pop(None) che non mi piace<br></div><div>Ci ho girato un po' intorno, ma non mi viene in mente come rimuoverlo a meno di introdurre degli "if" che mi piacciono ancora meno<br></div><div><br></div><div>voi che ne dite?<br></div><div>Marco<br><br></div><div>P.S. se non conoscete openpyxl vi dico che l'attributo "value" è il contenuto della cella, mentre l'attributo "column" è la sua coordinata x in notazione-excel, ossia "A", "B", etc.<br></div><div>Per esempio, la cella "D13" ha cell.column == "D"<br><br></div><div>P.P.S. boh, mi sa che vi ho dato un po' troppo contesto rispetto al problema vero e proprio.<br></div><div>Ma diciamo che è stata anche l'occasione per citare qualche tecnologia che mi ha fatto comodo: openpyxl e ... Django!<br></div></div></div>
_______________________________________________<br>
Python mailing list<br>
<a href="mailto:Python@lists.python.it" target="_blank">Python@lists.python.it</a><br>
<a href="http://lists.python.it/mailman/listinfo/python" target="_blank">http://lists.python.it/mailman/listinfo/python</a><br>
</blockquote></div></div>