xport je binární formát souborů používaný banda amerických vládních agentur pro publikování souborů dat. & Nbsp; to dávalo smysl, pokud jste se snaží číst datové soubory na mainframe IBM v roce 1988.
Jak mohu používat?
Udělejme to krátké a sladké:
import xport
s xport.XportReader (xport_file) jako čtenáře:
& Nbsp; na řádek ve čtečce:
& Nbsp; print řádek
Každý řádek bude dict s klíčem pro každé pole v datovém souboru. Hodnoty bude buď řetězec Unicode, float nebo int, v závislosti na typu uvedeného v souboru pro tuto oblast.
Jak info soubor
Jakmile budete mít XportReader objekt, existuje několik vlastnosti a metody, které vám dá informace o souboru:
- Reader.file: základní Python soubor objektů (viz následující kapitola).
- Reader.record_start: pozice (v bytech) v souboru, kde začít záznamy (viz následující kapitola).
& Nbsp; reader.record_length: délka (v bajtech) každého záznamu (viz následující kapitola).
- Reader.record_count (): počet záznamů v souboru. (Upozornění: toto se bude snažit do konce souboru k určení délky souboru.)
- Reader.file_info a reader.member_info: dicts obsahující informace o tom, kdy a jak byl datový soubor vytvořen.
- Reader.fields: seznam polí v datovém souboru. Každé pole je dict obsahující tyto klíče, zkopírované z spec:
& Nbsp; struct {NAMESTR
& Nbsp; krátké nType; / * Typ proměnné: 1 = numerický, 2 = char * /
& Nbsp; krátké nhfun; / * Hash nJméno (vždy 0) * /
& Nbsp; * krátký FIELD_LENGTH; / * DÉLKA variabilních pro pozorování * /
& Nbsp; krátké nvar0; / * VARNUM * /
& Nbsp; * Jméno char8; / * NAME variabilního * /
& Nbsp; * char40 štítek; / * LABEL variabilního * /
& Nbsp; char8 nform; / * NAME ve formátu * /
& Nbsp; krátký NFL; / * Pole formát délky nebo 0 * /
& Nbsp; * krátké num_decimals; / * FORMÁT počet desetinných * /
& Nbsp; krátké nfj; / * 0 = LEFT ODŮVODNĚNÍ, 1 = RIGHT JUST * /
& Nbsp; char nfill [2]; / * (Nepoužité, harmonizace právních předpisů a budoucí) * /
& Nbsp; char8 niform; / * NAME OF vstupní formát * /
& Nbsp; krátké nifl; / * Informat DÉLKA ATTRIBUTE * /
& Nbsp; krátké nifd; / * Informat počet desetinných * /
& Nbsp; dlouhé neziskové organizace; / * POLOHA z přidané hodnoty pro pozorování * /
& Nbsp; char zbytek [52]; / * Zbývající pole jsou irelevantní * /
& Nbsp;};
& nbsp; Poznámka: položky s hvězdami byly přejmenovány z krátkých názvů uvedených v spec. Protože se jedná o vydání alpha, může být další položky přejmenována v budoucnu, pokud mi někdo říká, co jsou pro.
Random přístup k záznamům
Pokud chcete přístup k určitým záznamů, místo iterace, můžete použít standardní přístupu k souborům funkce Python a trochu matematiky.
Získejte 1000. záznamu:
reader.file.seek (reader.record_start + reader.record_length * 1000, 0)
reader.next ()
Získejte rekord před poslední jeden přitažené za vlasy:
reader.file.seek (-reader.record_length * 2, 1)
reader.next ()
Získejte poslední záznam:
reader.file.seek (reader.record_start + reader.record_length * (reader.record_count () - 1), 0)
reader.next ()
(V tomto posledním příkladu, na vědomí, že nemůžeme požadovat od konce souboru, protože tam může být doplňkové bajty. Starou dobrou pevnou šířkou binární formáty souborů.)
Opravte / ukrást tento kód!
Napsal jsem to, protože to vypadalo, směšné, že neexistuje žádný jednoduchý způsob, jak číst standardní formát vláda dat ve většině programovacích jazyků. Možná jsem dostal všechno špatně. Pokud zjistíte, soubor, který není dekódovat propery, odeslat požadavek na pull. Oficiální spec je tady. Je to překvapivě jednoduché na binární formát souborů z 80. let.
Také prosím, neváhejte použít tento kód jako základ napsat si vlastní knihovnu pro váš oblíbený programovací jazyk. . Vládní údaje by měly být přístupné, man
Požadavky na :
- Python
Komentáře nebyl nalezen