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

Rispondere a