Script di post-elaborazione
Un'esportazione CSV può passare da uno script Python scritto da te prima di diventare il file da scaricare. Serve quando il file deve avere una forma che la scelta delle colonne non basta a dare: nomi con la maiuscola, una nota accanto a certi valori, i tag divisi in più colonne.
Lo script gira isolato, senza rete, con limiti di tempo e memoria. Il risultato è responsabilità di chi lo scrive.
Dove si scrive
- Nella finestra di esportazione: attiva Postprocessa l'export sotto le colonne. L'interruttore è disponibile solo con il formato CSV.
- In un modello di esportazione, con lo stesso interruttore. Scegliendo il modello nella finestra di esportazione, lo script si carica insieme alle colonne. Se lo modifichi o lo spegni, la tendina passa a Modello personalizzato.
Spegnere l'interruttore esclude lo script senza cancellarne il testo.
L'esportazione conserva lo script con cui è partita, visibile nel dettaglio in Impostazioni > Esportazioni.
Come funziona
- Riseact genera il CSV.
- Lo script legge
/work/input.csve scrive/work/output.csv. output.csvdiventa il file dell'esportazione; l'originale non viene conservato.- Il numero di record mostrato è quello delle righe di
output.csv, intestazione esclusa.
Se lo script fallisce, fallisce l'esportazione.
Il file di ingresso
- UTF-8 con BOM, separato da virgole, intestazione nella prima riga. Aprilo con
encoding="utf-8-sig"enewline="". - Le intestazioni sono le chiavi delle colonne (
email,tags,donation amount), descritte nelle pagine di ogni esportazione. - I valori multipli, come i tag, sono separati da virgola nella stessa cella.
Il file di uscita
- Scrivilo con
encoding="utf-8-sig"perché Excel legga le lettere accentate. - Riseact non lo valida: scarichi quello che lo script scrive.
- Se cambi nomi o valori delle colonne, il file potrebbe non essere più reimportabile.
Ambiente e limiti
| Interprete | Python 3.14, libreria standard |
| File | /work, con l'export input.csv |
| Rete | Nessuna |
| Memoria | 128 MB, di cui circa 40 occupati dall'interprete |
| Tempo | 20 minuti |
| Disco | Il triplo del file di ingresso, minimo 10 MB |
| Output | print va perso; lo stderr, traceback compreso, diventa il messaggio di errore |
Lavora riga per riga: un'esportazione grande non sta in 128 MB, quindi niente
list(reader). Se ti servono due passate, apri il file due volte.
Il tempo dello script si somma a quello dell'estrazione. Come riferimento, dividere i tag in colonne su un milione di righe richiede meno di un minuto.
Errori
- Eccezione non gestita o
sys.exitdiverso da 0: l'esportazione fallisce e il dettaglio mostra la parte finale dello stderr, di solito il traceback con il numero di riga di/work/script.py. - Tempo o disco esauriti: lo script viene fermato e il dettaglio indica il limite superato.
output.csvmancante: l'esportazione fallisce.
L'email di esito segnala il fallimento ma non riporta l'errore, perché un traceback può contenere dati personali.
Prova lo script su pochi record, con una selezione manuale o un filtro stretto, prima di lanciarlo su tutto l'archivio.
Esempio: prima lettera maiuscola
Nell'esportazione sostenitori, nome, cognome e città con l'iniziale maiuscola. Il
resto del valore non cambia: de luca diventa De luca.
import csv
COLUMNS = ["first name", "last name", "city"]
def capitalize(value):
return value[:1].upper() + value[1:]
with open("/work/input.csv", encoding="utf-8-sig", newline="") as f, open(
"/work/output.csv", "w", encoding="utf-8-sig", newline=""
) as out:
reader = csv.DictReader(f)
writer = csv.DictWriter(out, fieldnames=reader.fieldnames)
writer.writeheader()
for row in reader:
for column in COLUMNS:
row[column] = capitalize(row[column])
writer.writerow(row)Nelle esportazioni donazioni e pagamenti le stesse colonne si chiamano
supporter first name, supporter last name e supporter city.
Esempio: nota su certi valori
Nell'esportazione donazioni, aggiunge (ricorrente) alla frequenza delle donazioni
mensili e annuali.
import csv
COLUMN = "donation frequency"
NOTES = {
"MONTHLY": " (ricorrente)",
"ANNUALLY": " (ricorrente)",
}
with open("/work/input.csv", encoding="utf-8-sig", newline="") as f, open(
"/work/output.csv", "w", encoding="utf-8-sig", newline=""
) as out:
reader = csv.DictReader(f)
writer = csv.DictWriter(out, fieldnames=reader.fieldnames)
writer.writeheader()
for row in reader:
row[COLUMN] += NOTES.get(row[COLUMN], "")
writer.writerow(row)Da API
Le mutation supporterExportCreate, donationExportCreate e paymentExportCreate
accettano lo script nell'argomento script, solo con format: CSV.
exportModelCreate ed exportModelUpdate lo salvano nel campo script del modello.
L'esportazione espone lo script nel campo script; se lo script fallisce, il codice
di errore è SCRIPT_ERROR con il messaggio in errorMessage.
Fonte: https://dev.riseact.org/docs/exporters/script. Copia automatica da dev.riseact.org: non modificare qui, le modifiche vanno fatte sulla documentazione Docusaurus.