2012-04-12 15 views
5

Używam python z numpy do odczytu danych z modelu numerycznego w pliku tekstowym o dość skomplikowanym formacie.Python: czytanie skomplikowanych plików tekstowych z numpy

Funkcje genfromtxt i zfile Numpy działają dobrze, ale tylko wtedy, gdy dane są uporządkowane. Moje pliki danych wygląda mniej więcej tak:

------ ciach

[sitename] [dimemsion 1 size] [dimension 2 size] 
[data for dim 1] 
[data for dim 2] 
[date/time] 
[header data] 
[data (dim1 * dim2)] 
[header] 
[data] 
... 
. 
. 
[data/time] 
[header] 
[data] 
. 
. 
etc... 

---- ciach

Tak, mam mieszankę tekstu i liczb i skomplikowane (ale powtarzanie) układu. Jak najlepiej to przeczytać przy użyciu numpy?

Cheers,

Chris

+1

Czy trzeba używać 'numpy "tylko metody? Może lektura mogłaby być wykonana zwykłym pytonem. –

Odpowiedz

5

Numpy nie jest dobry w uogólnionej parsowania, więc chcesz zrobić dobrze wyglądać poza nim, a co wybrać zależeć będzie głównie od sposobu zgodne pliki są.

Jeśli są niezwykle ultra-spójne, można powiedzieć, że można po prostu wyodrębnić liczby ze znanych pozycji i znanych wierszy, niż można po prostu odczytać w pliku wiersz po wierszu jako żądło i zindeksować go do postaci, którą chcieć. (Przejrzyj plik, np. Za pomocą pliku file.readlines, aby uzyskać każdą linię w postaci ciągu znaków.)

Zwykłym przypadkiem (przynajmniej taki, jaki znajduję) jest to, że jest bardziej zróżnicowany niż powyżej, ale te proste operacje na ciągach mogą być używane do analizowania linii, na przykład string.split (co jest prawie zawsze moim pierwszym krokiem), itp.

Poza tym istnieje wiele bibliotek parsujących w Pythonie. Jestem stronniczy w stosunku do pyparsing (ale nie znam dobrze innych, więc nie jest to uczciwe porównanie). Oto a summary of the various parsing libraries.

+0

+1 dla pyparsing. Jest to absolutnie odpowiednie narzędzie do pracy tutaj. –

+0

Dzięki - dam ci pyparię. Ponieważ jest to oparte na pythonie (zamiast modułu c, takiego jak numpy.fromfile), myślę, że będzie to zauważalnie wolniejsze niż użycie numpy? Chris – ccbunney

+0

Tak, pyparowanie jest znacznie wolniejsze niż plik numpy.from, przynajmniej z mojego doświadczenia. Myślę, że również robi to o wiele więcej. Ponadto, mimo że jest to dobra biblioteka, wymaga trochę nauki. Z tego powodu, polecam najpierw spróbować z podstawowymi operacjami na łańcuchach, jako że zwykle to robią, a jeśli to nie działa, idź do pyparsingu (chyba, że ​​i tak chciałbyś się nauczyć pypargu). – tom10

1

Zgadzam się z poprzednią odpowiedzią. Poniższy łańcuch kroków działają najlepiej i są dużo łatwiejsze niż pyparsing lub numpy.genfromtxt

inp = open(textfilename).readlines() 
my_list = [] 
for line in inp: 
    item = str.split(line) 
    my_list.append(float(item[0])) 

Następnie można łatwo przekonwertować listę w numpy tablicy/matrycy i kontynuować stamtąd