[Python] idio[ma]ticità
Massimiliano della Rovere
massimiliano.dellarovere a gmail.com
Lun 20 Apr 2015 15:28:56 CEST
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 <depaolim a 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 a lists.python.it
> http://lists.python.it/mailman/listinfo/python
>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20150420/ca6bdaec/attachment-0001.html>
Maggiori informazioni sulla lista
Python