[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