Przetwarzanie danych z pliku tekstowego

0

Mam plik tekstowy z danymi w formacie jak poniżej:

[POLYGON]
Type=0x40
Data0=(50.40790,20.79988),(50.40748,20.79962),(50.40723,20.79994),(50.40777,20.80033)
[END]

[POLYLINE]
Type=0x26
Label=Stoki
DirIndicator=1
Data0=(50.40094,19.61265),(50.40065,19.61273),(50.40043,19.61271)
[END]

Każdy obiekt zaczyna się znacznikiem określającym jego typ, np. [POLYGON] i kończy znacznikiem zamykającym [END]. Pomiędzy znacznikami znajdują się linie z atrybutami danego obiektu, w formacie atrybut=wartość, np. atrybut Type ma dla pierwszego obiektu z przykładu wartość 0x40, dla drugiego 0x26. Część atrybutów jest opcjonalna, ich lista nie jest zamknięta. Pomiędzy obiektami mogą znajdować się linie z komentarzami.

Cel: odczytywać z pliku kolejno obiekty danego typu i wartości wybranych atrybutów. Czyli np. dla wszystkich kolejnych obiektów POLYLINE w pliku wyciągać wartości Data0,Type i Label.

W tej chwili próbuję to robić czytając w pętli kolejne linie z pliku, i potem sprawdzam warunkami if czy to jest znacznik, atrybut itd., potem wycinam i formatuje wartość dla każdego z potrzebnych atrybutów, po końcowym znaczniku przekazuje wartości dalej - robi się "spaghetti" i podejrzewam, że jest w Pythonie lepszy sposób na przetwarzanie takich plików. Proszę o nakierowanie, jak to powinno się napisać.

2

Gwoli ścisłości – to jest zwykły plik INI, posiada sekcje w nawiasach [], a oprócz nich także linie z danymi, składające się z kluczy (lewy operand), znaku = oraz wartości (prawy operand, może być pusty).

Autor tego pliku świadomie wykorzystał funkcjonalność formatu, używając pustych sekcji [END] jako pseudoznaczników zamykających (sam format takich nie definiuje). Można tak zrobić, dlatego że unikalność identyfikatorów nie jest narzucona przez format, a więc zależna od implementacji API w konkretnym języku. Niektóre implementacje mogą wyrzucać błąd podczas parsowania, więc jest to dość ryzykowne posunięcie.


Inny zapis, ale zgodny składniowo:

[POLYGON]
Type=0x40
Data0=(50.40790,20.79988),(50.40748,20.79962),(50.40723,20.79994),(50.40777,20.80033)

[END]
; pusta sekcja
 
[POLYLINE]
Type=0x26
Label=Stoki
DirIndicator=1
Data0=(50.40094,19.61265),(50.40065,19.61273),(50.40043,19.61271)

[END]
; druga pusta sekcja

Więcej informacji znajdziesz np. tutaj.

0

Dziękuję, configparser elegancko rozwiązał problem.
To jeszcze takie pytanie, żeby nowego wątku nie otwierać - dane w pliku mam w kodowaniu windows-1250, czy otwarcie pliku do odczytu z parametrem encoding:

fp= open(filename,'r',encoding="windows-1250")

powoduje że będą one automatycznie konwertowane na UTF-8 przy odczycie (Python3)?

1 użytkowników online, w tym zalogowanych: 0, gości: 1