Domanda

Questo è quello che ho fatto per un progetto. Ho un paio di strutture di dati che sono bascially dizionari con alcuni metodi che operano sui dati. Quando li risparmio su disco, scrivo fuori a .py file come codice che se importati come modulo caricherà gli stessi dati in una tale struttura di dati.

E 'questo ragionevole? Ci sono grandi svantaggi? Il vantaggio che vedo è che quando voglio operare con i dati salvati, posso importare rapidamente i moduli di cui ho bisogno. Inoltre, i moduli possono essere utilizzati separata dal resto dell'applicazione, perché non hai bisogno di una funzionalità di parser o caricatore separato.

È stato utile?

Soluzione

E 'ragionevole, e lo faccio tutto il tempo. Ovviamente non è un formato utilizzato per lo scambio di dati, quindi non è un buon formato per qualche cosa come un file di salvataggio.

Ma per esempio, quando faccio le migrazioni di siti web per Plone, ottengo spesso i dati relativi al sito (ad esempio un elenco di quali pagine devono essere migrati, o un elenco di come vecchi URL devono essere mappati a quelli nuovi, aor liste di tag). Questi in genere si ottiene in formato Word och Excel. Anche i dati devono spesso massaggiare un po ', e io alla fine con quello che per tutti gli effetti sono una dizionari di mappatura un URL ad altri dettagli.

Certo, I potrebbero salvo che come CVS, e analizzarlo in un dizionario. Ma invece io di solito salvarlo come file di Python con un dizionario. Salva codice.

Quindi, sì, è ragionevole, no non è un formato che si dovrebbe usare per qualsiasi tipo di file di salvataggio. E 'tuttavia spesso usato per i dati che si trova a cavallo del confine alla configurazione, come sopra.

Altri suggerimenti

Operando in questo modo, si può guadagnare un po 'po' di vantaggio, ma si paga molti tipi di prezzo per questo. Lo spazio necessario per salvare i dati, e il tempo che ci vuole per entrambi salvare e ricaricare, andate in modo sostanziale; e l'esposizione di sicurezza è illimitato - è necessario ferocemente proteggere i percorsi da cui si ricarica moduli, come sarebbe fornire una via facile per qualsiasi utente malintenzionato di iniettare codice non autorizzato che deve essere eseguito sotto l'userid (pickle sé non è solido come una roccia , la sicurezza-saggio, ma, rispetto a tale accordo, si risplende; -).

Tutto sommato, preferisco una disposizione più semplice e più tradizionale: il codice eseguibile vive in un modulo (su un tipico percorso di codice di caricamento, che non ha bisogno di essere R / W, una volta compilata del modulo) - diventa caricato solo una volta e da un modulo già compilato. I dati vivono nelle proprie file (o porzioni di DB, ecc) in uno dei tanti formati adatti, per lo più quelli standard (possibilmente compresi quelli multi-lingua, come JSON, CSV, XML, ... & c, se voglio mantenere la possibilità per caricare facilmente i dati provenienti da altre lingue in futuro).

Il più grande svantaggio è che si tratta di un potenziale problema di sicurezza dal momento che è difficile garantire che i file non contiene codice arbitrario, che potrebbe essere davvero male. Quindi non utilizzare questo approccio se qualcun altro che si ha accesso in scrittura ai file.

Una soluzione ragionevole potrebbe essere quella di utilizzare il Pickle modulo, che è specificamente progettato per salvare e ripristinare le strutture pitone su disco.

La risposta di Alex Martelli è assolutamente penetranti e sono d'accordo con lui. Tuttavia, andrò un passo avanti e fare una raccomandazione specifica:. Utilizzare JSON

JSON è semplice, e le strutture dati di Python mappa bene in esso; e ci sono diverse librerie standard e strumenti per lavorare con JSON. Il modulo json in Python 3.0 e successivi si basa su simplejson , quindi vorrei usare simplejson in Python 2.x e json in Python 3.0 e successivi.

Seconda scelta è XML. XML è più complicato, e più difficile da guardare solo al (o semplicemente modificare con un editor di testo), ma c'è una grande ricchezza di strumenti per convalidarlo, filtrare, modificarlo, ecc.

Inoltre, se la memorizzazione dei dati e le esigenze di recupero diventano affatto banale, considerare l'utilizzo di un database vero e proprio. SQLite è fantastico: è piccolo, e per le piccole banche dati corre molto veloce, ma è un vero e proprio database SQL reale. Avrei sicuramente utilizzare un Python ORM invece di imparare SQL per interagire con il database; il mio preferito ORM per SQLite sarebbe Autunno (piccolo e semplice), o l'ORM da Django (non c'è nemmeno bisogno di imparare a creare le tabelle in SQL!) Quindi, se mai troppo grande per SQLite, è possibile spostare fino ad un vero e proprio database come PostgreSQL . Se vi trovate a scrivere un sacco di cicli che cercano attraverso i dati salvati, e soprattutto se avete bisogno di far rispettare le dipendenze (ad esempio se foo viene eliminato, bar devono essere eliminati anche) in considerazione di andare a un database.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top