ksportuj jest binarny format plików używany przez grono amerykańskich agencji rządowych do publikacji zbiorów danych. & Nbsp; To miało wiele sensu, jeśli były próby odczytu plików danych na komputerze mainframe IBM w 1988.
Jak go używać?
Zróbmy to krótko i słodko:
Import ksportuj
z xport.XportReader (xport_file) jako czytelnika:
& Nbsp; dla wiersza w czytniku:
& Nbsp; do druku wiersz
Każdy rząd będzie dict z kluczem dla każdego pola w zestawie danych. Wartości będą albo ciąg Unicode, pływaka lub int, w zależności od typu określonego w pliku na tym polu.
Uzyskiwanie informacji plik
Gdy masz obiekt XportReader, istnieje kilka właściwości i metody, które dadzą Ci szczegółowe informacje na temat pliku:
- Reader.file: bazowy obiekt pliku Python (patrz następny punkt).
- Reader.record_start: położenie (w bajtach) w pliku, gdzie rozpocząć zapisy (patrz następny punkt).
& Nbsp; reader.record_length: długość (w bajtach) każdego rekordu (patrz następny punkt).
- Reader.record_count (): Liczba rekordów w pliku. (Uwaga: będzie dążyć do końca pliku, do określenia długości pliku).
- Reader.file_info i reader.member_info: dicts zawierające informacje, kiedy i jak zestaw danych został stworzony.
- Reader.fields: lista pól w zbiorze danych. Każde pole jest dict zawierający następujące klucze, skopiowane z spec:
& Nbsp; struct NAMESTR {
& Nbsp; krótkie ntype; / * Zmienna typu: 1 = numeryczne, 2 = CHAR * /
& Nbsp; krótkie nhfun; / * Skrót NNAME (zawsze 0) * /
& Nbsp; * krótkie field_length; / * DŁUGOŚĆ zmiennej w OBSERWACJI * /
& Nbsp; krótkie nvar0; / * Varnum * /
& Nbsp; * Nazwa char8; / * Nazwa zmiennej * /
& Nbsp; * Etykieta char40; / * LABEL zmiennej * /
& Nbsp; char8 Nform; / * NAZWA FORMAT * /
& Nbsp; krótkie NFL; / * FORMAT polu długości LUB 0 * /
& Nbsp; * krótkie num_decimals; / * Format liczb dziesiętnych * /
& Nbsp; krótkie nfj; / * 0 = UZASADNIENIE LEWY, PRAWY TYLKO 1 = * /
& Nbsp; char nfill [2]; / * (NIEUŻYWANY, dla wyrównania i przyszłości) * /
& Nbsp; char8 niform; / * NAZWA format wejściowy * /
& Nbsp; krótkie nifl; / * INFORMAT wartość atrybutu * /
& Nbsp; krótkie nifd; / * NUMER INFORMAT dziesiętnych * /
& Nbsp; długie ONP; / * STANOWISKO WARTOŚCI w obserwacji * /
& Nbsp; char reszta [52]; / * Pozostałe pola są nieistotne * /
& Nbsp;};
& nbsp; UWAGA: przedmioty z gwiazdami zostały przemianowane z krótkich nazw podanych w specyfikacji. Ponieważ jest to wersja alpha, pozostałe elementy mogą zostać zmieniona w przyszłości, gdy ktoś mi mówi, co oni za.
Losowe dostęp do informacji
Jeśli chcesz uzyskać dostęp do konkretnych zapisów, zamiast iteracji, można używać standardowych funkcji dostępu do plików Pythona i trochę matematyki.
Pobierz 1.000-gie rekord:
reader.file.seek (reader.record_start + reader.record_length * 1000, 0)
reader.next ()
Pobierz rekord przed ostatnią z naciągane:
reader.file.seek (-reader.record_length * 2, 1)
reader.next ()
Pobierz ostatni rekord:
reader.file.seek (reader.record_start + reader.record_length * (reader.record_count () - 1), 0)
reader.next ()
(W tym ostatnim przykładzie, należy pamiętać, że nie możemy ubiegać się o końcu pliku, ponieważ nie może być bajty wypełniające. Dobry stary stałej szerokości binarnych formatów plików.)
Popraw / ukraść ten kod!
Napisałem to, bo wydawało się śmieszne, że nie ma łatwy sposób czytać standardowy format danych rządu w większości języków programowania. I może zdobyć rzeczy źle. Jeśli znajdziesz plik, który nie dekodowania propery, wysłać wniosek ściągania. Oficjalna specyfikacja jest tutaj. Jest to niezwykle proste w formacie binarnym z lat 80-tych.
Proszę również zachęcamy do korzystania z tego kodu jako podstawę do napisania własnej biblioteki na ulubiony język programowania. . Dane rządowe powinny być dostępne, człowiek
Wymagania :
- Python
Komentarze nie znaleziono