ksporter er det binære filformat der bruges af en flok amerikanske regeringsorganer til udgivelse datasæt. & Nbsp; Det gjorde en god mening, hvis du prøvede at læse datafiler på IBM mainframe tilbage i 1988.
Hvordan bruger jeg det?
Lad os gøre dette kort og søde:
import ksporter
med xport.XportReader (xport_file) som læseren:
& Nbsp; for række i læseren:
& Nbsp; print rækken
Hver række vil være en dict med en nøgle for hvert felt i datasættet. Værdier vil være enten en Unicode-streng, en flyder eller en int, afhængigt af hvilken type er angivet i filen for det pågældende felt.
Kom fil info
Når du har en XportReader objekt, der er et par egenskaber og metoder, der vil give dig oplysninger om filen:
- Reader.file: den underliggende Python fil objekt (se næste afsnit).
- Reader.record_start: positionen (i byte) i dokumenterne, hvor registreringer begynder (se næste afsnit).
& Nbsp; reader.record_length: længden (i byte) af hver post (se næste afsnit).
- Reader.record_count (): antallet af poster i filen. (Advarsel: Dette vil søge til slutningen af filen for at bestemme fil længde.)
- Reader.file_info og reader.member_info: Jæger-samler- med oplysninger om, hvornår og hvordan datasættet blev oprettet.
- Reader.fields: liste over felter i datasættet. Hvert felt er en dict indeholder følgende taster kopieres fra spec:
& Nbsp; struct NAMESTR {
& Nbsp; kort ntype; / * Variabeltype: 1 = NUMERIC, 2 = char * /
& Nbsp; kort nhfun; / * Hash af NNAME (altid 0) * /
& Nbsp; * kort field_length; / * LÆNGDE variabel i OBSERVATION * /
& Nbsp; kort nvar0; / * VARNUM * /
& Nbsp; * char8 navn; / * NAVN VARIABLE * /
& Nbsp; * char40 mærke; / * LABEL af variable * /
& Nbsp; char8 nform; / * NAVN FORMAT * /
& Nbsp; kort nfl; / * Formatfelt længde eller 0 * /
& Nbsp; * korte num_decimals; / * FORMAT antal decimaler * /
& Nbsp; kort NFJ; / * 0 = LEFT BEGRUNDELSE, 1 = højre lige * /
& Nbsp; char nfill [2]; / * (Ubrugt, for tilpasning og FREMTID) * /
& Nbsp; char8 niversal; / * NAVN INPUT FORMAT * /
& Nbsp; kort nifl; / * INFORMAT LÆNGDE ATTRIBUTE * /
& Nbsp; kort nifd; / * INFORMAT antal decimaler * /
& Nbsp; lange almennyttige organisationer; / * HOLDNING VÆRDI I OBSERVATION * /
& Nbsp; char hvile [52]; / * Resterende felter er irrelevante * /
& Nbsp;};
& nbsp; BEMÆRK: poster med stjerner er blevet omdøbt fra de korte navne givet i spec. Da dette er en alpha release, kan andre emner omdøbes i fremtiden, hvis nogen fortæller mig, hvad de er for.
Random adgang til registre
Hvis du vil have adgang til bestemte poster, i stedet for iteration, kan du bruge Python s standard fil adgang funktioner og lidt matematik.
Få 1000. rekord:
reader.file.seek (reader.record_start + reader.record_length * 1000, 0)
reader.next ()
Få rekord før seneste beretning blev hentet:
reader.file.seek (-reader.record_length * 2, 1)
reader.next ()
Få sidste rekord:
reader.file.seek (reader.record_start + reader.record_length * (reader.record_count () - 1), 0)
reader.next ()
(I dette sidste eksempel, opmærksom på, at vi ikke kan søge fra slutningen af filen, fordi der kan være polstring bytes. Gode gamle fast bredde binære filformater.)
Ret / stjæle denne kode!
Jeg skrev dette, fordi det virkede latterligt, at der ikke var nogen nem måde at læse en standard regering dataformat i de fleste programmeringssprog. Jeg kan har fået tingene galt. Hvis du finder en fil, der ikke afkode propery, sende en pull anmodning. Den officielle spec er her. Det er overraskende ligetil for et binært filformat fra 80'erne.
Du er også velkommen til at bruge denne kode som en base til at skrive dit eget bibliotek til dine foretrukne programmeringssprog. . Offentlige data skal være tilgængelige, mand
Krav :
- Python
Kommentarer ikke fundet