se non ti piace il pop potresti cambiare kwargs = {columns[c.column]: c.value for c in row} in
kwargs = { columns[c.column]: c.value for c in row if c.column is not None} non mi è chiara una cosa: come finisce quel None nel descrittore delle colonne dell'xslx/db? Il giorno lun 20 apr 2015 alle ore 14:19 Marco De Paoli <depao...@gmail.com> ha scritto: > dopo il talk di Alex su codice pythonico/idiomatico... > beh, non posso lasciar passare il seguente caso senza chiedervi un opinione > > dunque il caso è questo > ho un file Excel xlsx con righe da caricare una a una su DB > > non consigliatemi di utilizzare un ETL, perchè non è questo il punto > ah, a proposito, ho scoperto che per mangeggiare i file xlsx, openpyxl va > alla grande > > tornando a noi... > la prima riga dell'xlsx è un intestazione che stabilisce i nomi dele > colonne > > avevo chiesto che usassero i nomi uno a uno con i nomi dei campi su db. > ma, no, sarebbe stato troppo semplice e logico, per cui i nomi sono a dir > poco fantasiosi e volatili > > Indi per cui ho un dict che rimappa nomi-colonne-xlsx con nomi-campi-db > > XLSX_COLUMN_NAMES = { > 'IL nome' : 'name', > 'RIFERIMENTO a GIGIO': 'gigio_id', > } > > il piano per il caricamento dati è il seguente: iterare sulle righe > dell'xlsx, costruire un kwargs, fare l'insert > abbastanza KISS, insomma > > ok, show me the code! > > import openpyxl as pyx > from .models import MyModel > > CN = XLSX_COLUMN_NAMES > > wb = pyx.load_workbook("sample.xlsx")) > ws = wb['DB'] > columns = {c.column: CN.get(c.value) for c in ws.rows[0]} > > > > MyModel.objects.all().delete() > for row in > ws.rows[1:]: > kwargs = {columns[c.column]: c.value for c in row} > > kwargs.pop(None) > > MyModel(**kwargs).save() > > > 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) > ma non è la parte importante: non fanno altro che cancellare tutti i > record e poi inserirli uno per uno > > E' quel kwargs.pop(None) che non mi piace > 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 > > voi che ne dite? > Marco > > 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. > Per esempio, la cella "D13" ha cell.column == "D" > > P.P.S. boh, mi sa che vi ho dato un po' troppo contesto rispetto al > problema vero e proprio. > Ma diciamo che è stata anche l'occasione per citare qualche tecnologia che > mi ha fatto comodo: openpyxl e ... Django! > _______________________________________________ > Python mailing list > Python@lists.python.it > http://lists.python.it/mailman/listinfo/python >
_______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python