xport è il formato di file binario utilizzato da un gruppo di agenzie governative degli Stati Uniti per la pubblicazione di set di dati. & Nbsp; ha fatto un sacco di senso se si stesse cercando di leggere file di dati sul mainframe IBM nel 1988.
Come si usa?
Facciamo questo breve e dolce:
import xport
con xport.XportReader (xport_file) come lettore:
& Nbsp; per riga in lettore:
& Nbsp; riga di stampa
Ogni riga sarà un dict con una chiave per ogni campo nel set di dati. Valori sarà una stringa unicode, un galleggiante o un int, a seconda del tipo specificato nel file per quel campo.
Ottenere informazioni file
Una volta che avete un oggetto XportReader, ci sono alcune proprietà e metodi che vi darà i dettagli relativi al file:
- Reader.file: l'oggetto file Python sottostante (vedere la sezione successiva).
- Reader.record_start: la posizione (in bytes) nel file in cui iniziano i record (vedere la sezione successiva).
& Nbsp; reader.record_length: la lunghezza (in byte) di ogni record (vedi paragrafo successivo).
- Reader.record_count (): numero di record nel file. (Attenzione: questo cercherà alla fine del file per determinare la lunghezza del file.)
- Reader.file_info e reader.member_info: dicts contenenti informazioni su quando e come il set di dati è stato creato.
- Reader.fields: elenco di campi nel set di dati. Ogni campo è un dict contiene i seguenti tasti, copiati dalla spec:
& Nbsp; struct nameStr {
& Nbsp; a breve NTYPE; / * VARIABILE TIPO: 1 = NUMERICO, 2 = CHAR * /
& Nbsp; a breve nhfun; / * Hash Nname (sempre 0) * /
& Nbsp; * field_length breve; / * LUNGHEZZA VARIABILE IN OSSERVAZIONE * /
& Nbsp; a breve nvar0; / * * VARNUM /
& Nbsp; * nome char8; / * NOME VARIABILE * /
& Nbsp; * etichetta char40; / * ETICHETTA DI VARIABILE * /
& Nbsp; char8 Nform; / * NOME DEL FORMAT * /
& Nbsp; a breve nfl; / * Formato del campo lunghezza o 0 * /
& Nbsp; * num_decimals brevi; / * NUMERO FORMATO di decimali * /
& Nbsp; a breve NFJ; / * 0 = giustificazione a sinistra, 1 = destra appena * /
& Nbsp; char nfill [2]; / * (UNUSED, PER ALLINEAMENTO E FUTURO) * /
& Nbsp; char8 niform; / * Nome del formato di input * /
& Nbsp; a breve nifl; / * INFORMAT attributo lunghezza * /
& Nbsp; nifd breve; / * NUMERO INFORMAT di decimali * /
& Nbsp; lunghe NPO; / * POSIZIONE DEL VALORE IN OSSERVAZIONE * /
& Nbsp; char resto [52]; / * Campi restanti sono irrilevanti * /
& Nbsp;};
& nbsp; NOTA: oggetti con stelle sono state rinominate dai nomi brevi indicati nelle specifiche. Poiché si tratta di una versione alpha, altri elementi possono essere rinominati in futuro, se qualcuno mi dice cosa servono.
l'accesso casuale ai record
Se si desidera accedere record specifici, invece di iterazione, è possibile utilizzare le funzioni di accesso ai file standard di Python e un po 'di matematica.
Get record di 1000:
reader.file.seek (reader.record_start + reader.record_length * 1000, 0)
reader.next ()
Ricevi record prima più uno recente inverosimile:
reader.file.seek (-reader.record_length * 2, 1)
reader.next ()
Ottenere ultimo record:
reader.file.seek (reader.record_start + reader.record_length * (reader.record_count () - 1), 0)
reader.next ()
(In questo ultimo esempio, notare che non possiamo cercare dalla fine del file, perché ci potrebbero essere byte di riempimento. I buoni vecchi a larghezza fissa formati di file binari.)
Correggi / rubare il codice!
Ho scritto questo in su perché sembrava ridicolo che non c'era modo di facile lettura un formato di dati di governo standard nella maggior parte dei linguaggi di programmazione. Forse ho ottenuto cose sbagliate. Se si trova un file che non decodifica propery, inviare una richiesta di pull. La specifica ufficiale è qui. E 'sorprendentemente semplice per un formato di file binario degli anni '80.
Si prega anche sentirsi liberi di utilizzare questo codice come base per scrivere la propria libreria per il linguaggio di programmazione preferito. . Dati del governo dovrebbero essere accessibili, man
Requisiti :
- Python
I commenti non trovato