[Python] idio[ma]ticità

Marco De Paoli depaolim a gmail.com
Lun 20 Apr 2015 14:19:12 CEST


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!
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20150420/4f76ffd3/attachment.html>


Maggiori informazioni sulla lista Python