Zanurkuj w Pythonie/Wyjątki i operacje na plikach - wszystko razem: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Sasek (dyskusja | edycje)
tłumaczenie
Robwolfe (dyskusja | edycje)
Nie podano opisu zmian
Linia 18:
return [getFileInfoClass(f)(f) for f in fileList] #(6)
 
# <tt>listDirectory</tt> jest główną atrakcją tego modułu. BierzePrzyjmuje ona na wejściu folder <tt>directory</tt> (np. <tt class="lang-none">c:\music\_singles\</tt>) i listuje wszystkie pliki olistę interesujących nas rozszeżeniachrozszerzeń plików (jak na przykładnp. <tt>['.mp3']</tt>), a następnie zwraca listę instancji klas, które działają podobnie jak słowniki, a przechowują one metadane na temat każdego interesującego nas pliku w tym katalogu. I to wszystko jest wykonywane za pomocą kilku prostych linii kodu.
# Jak dowiedziałeś się w poprzednim rozdialerozdziale, ta linia kodu zwraca listę pełnych ścieżek wszystkich plików z folderu, które mają interesujące nas rozszerzenie (podane w argumencie <tt>fileExtList</tt>.
# Starzy programiści Pascala znają zagnieżdżone funkcje (funkcje wewnątrz funkcji), ale większość ludzi jest zdziwionych, gdy mówię im, że Python je wspiera. ZagniżdżonaZagnieżdżona funkcja <tt>getFileInfoClass</tt> może być wywołana tylko z funkcji, w której jest zadeklarowana -- <tt>listDirectory</tt>. Jak w przypadku każdej innej funkcji., nie musisz przejmować się deklaracją interfejsu ani niczym innym. Po porstuprostu zdefiniuj funkcję i napisz jej ciało.
# Teraz, gdy już znasz moduł <tt>os</tt>, ta linia powinna nabrać sensu. Pobiera ona rozszerzenie pliku (<tt>os.path.splitestsplitext(filename)[1]</tt>), przkaształcaprzekształca je do dużych liter (<tt>.upper()</tt>), odcina kropkę (<tt>[1:]</tt>) i tworzy nazwę klasy używając stringu formatującego. <tt>c:\music\ap\mahadeva.mp3</tt> staje się więc <tt>.mp3</tt>, potem <tt>.MP3</tt> następnie <tt>MP3</tt> i na końcu <tt>MP3FileInfo</tt>.
# Mając nazwę klasy obsługującej ten plik, sprawdzamy czy tak klasa istnieje w tym module. Jeśli tak, zwracamy tę klasę, jeśli nie -- klasę bazową <tt>FileInfo</tt>. To bradzo ważne: zwracamy klasę. Nie obiekt, ale klasę samą w sobie.
# Dla każdego pliku z listy <tt>fileList</tt> wołamy <tt>getFileInfoClass</tt> z nazwą pliku <tt>(f)</tt>. Wywołanie <tt>getFileInfoClass(f)</tt> zwraca klasę. DokłądnieDokładnie nie wiadomo jaką, ale to nam nie przeszkadza. Potem tworzymy obiekt tej klasy (jaka ona by ona nie była) i przekazujemy nazwę pliku (znów <tt>f</tt>) do jej metody <tt>__init__</tt>. Jak pamiętasz z wcześniejszych rozdziałów, metoda <tt>__init__</tt> klasy <tt>FIleInfo</tt> ustawia <tt>self["name"]</tt>, co powoduje wywołanie <tt>__setitem__</tt> klasy pochodnej <tt>MP3FileInfo</tt> żeby odpowiednio przetworzyć plik i wyciągnąć jego metadane. Robimy to wszystko dla każdego interesującego pliku i zwracamy listę obiektów wynikowych.
 
Zauważ, że metoda <tt>listDirectory</tt> jest bardzo ogólna. Nie wie w żaden sposób z jakimi typami plików będzie pracować ani jakie klasy są zdefiniowane do obsługi tych plików. zaczynaZaczyna pracę od przejrzenia folderu, w poszukiwaniu plików do przetwarzania a potem analizuje swój moduł żeby sprawdzić, jakie klasy obsługi (jak na przykład <tt>MP3FileInfo</tt>) są zdefiniowane. Możesz rozszerzyć ten program, żeby obsługiwać inne typy plików definiując klasy o odpowiednich nazwach: <tt>HTMLFileInfo</tt> dla plikółplików HTML, <tt>DOCFileInfo</tt> dla plików Worda i tak dalej. <tt>listDirectory</tt> obsłuży je wszystkie bez modyfikacji, zrzucając całęcałe przetwarzanie na odpowiednie klasy i zbierając wyniki.
 
<noinclude>