2012-12-18 16 views
15

Esiste un modo per verificare se un file è stato creato da pickle? Potrei solo rilevare eccezioni generate da pickle.load ma non esiste un'eccezione specifica "non un file pickle".Come verificare se un file è stato creato da pickle?

+9

Verificare la presenza di tracce di aceto e aneto –

+0

Sei preoccupato che un file sia stato * creato * quando hai usato 'pickle.dump' o se esiste un file quando usi' pickle.load'? In entrambi i casi, l'errore si verifica quando si apre l'handle del file per l'output o l'input, non nella riga effettiva del 'pickle'. –

+0

Non sono preoccupato che il file esista o meno ma sul fatto che un file esistente sia stato creato da 'pickle'. – Erik

risposta

8

I file di sottaceti non hanno un'intestazione quindi non esiste un modo standard per identificarli evitando di annullarne uno e verificando se vengono sollevate eccezioni.

È possibile definire il proprio protocollo avanzato che include una sorta di intestazione sottoclassando le classi Pickler() e Unpickler() nel modulo pickle. Tuttavia questo non può essere fatto con il modulo molto più veloce cPickle perché ci sono funzioni di fabbrica in esso che non possono essere sottoclasse [1].

Un approccio più flessibile sarebbe definire le proprie classi indipendenti che utilizzavano le corrispondenti istanze Pickler() e Unpickler() da uno di questi moduli nella sua implementazione.

Aggiornamento

L'ultimo byte di tutti i file sottaceto dovrebbe essere il pickle.STOP codice operativo, così, mentre non c'è un colpo di testa, non v'è efficacemente un trailer molto minimale, che sarebbe una cosa relativamente semplice da dai un'occhiata.

seconda dell'uso esatto, potrebbe essere in grado di cavarsela con integrazione che, con qualcosa di più elaborato poiché tutti i dati oltre il STOP codice operativo nella rappresentazione di un oggetto in salamoia viene ignorato [2].

[1]     Footnote [2] nella documentazione Python 2.
[2]     Documentazione per pickle.loads(), che si applica anche a pickle.load() poiché è attualmente implementato in termini di quest'ultimo.
7

Non esiste un modo sicuro se non tentare di annullarlo e rilevare eccezioni.

Problemi correlati