Zanurkuj w Pythonie/Praca z katalogami: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Robwolfe (dyskusja | edycje)
Nie podano opisu zmian
Robwolfe (dyskusja | edycje)
Nie podano opisu zmian
Linia 1:
{{Podświetl|py}}
== 6.5. Praca z folderamikatalogami ==
 
Moduł <tt>os.path</tt> zawiera kilka funkcji służących do manipulacji plikami i folderamikatalogami. Przyjrzymy się teraz obsłudze ścieżek i odczytywaniu zawartości katalogów.
 
'''Przykład 6.16. Tworzenie ścieżek do plików'''
Linia 19:
# Funkcja <tt>join</tt> modułu <tt>os.path</tt> tworzy ścieżkę dostępu do pliku z jednej lub kilku ścieżek częściowych. W tym przypadku po prostu łączy dwa stringi. (Zauważ, że w Windowsie musisz używać podwójnych ukośników)
# W tym, trochę bardziej skomplikowanym, przypadku, <tt>join</tt> dopisze dodatkowy ukośnik do ścieżki przed dołączeniem do niej nazwy pliku. Byłem bardzo szczęśliwy, gdy to odkryłem, bo <tt>addSlashIfNecessary</tt> było jedną z najgłupszych małych funkcji, które musiałem napisać zaczynając programować w nowym języku. Nie pisz tej głupiej funkcji w Pythonie, mądrzy ludzie zrobili to już za Ciebie.
# <tt>expanduser</tt> rozwninie w ścieżce znak <tt>~</tt> na ścieżkę folderu domowego aktualnie zalogowanego użytkownika. Ta funkcja działa w każdym systemie, w którym użytkownicy mają swoje folderykatalogi domowe, między innymi w Windows, UNIX i Mac OS X; nic nie robi w systemie Mac OS
# Używając tych technik, możesz łatwo tworzyć ścieżki do plików i folderówkatalogów wewnątrz folderukatalogu domowego.
 
'''Przykład 6.17. Rozdzielanie ścieżek'''
Linia 36:
>>> extension
'.mp3'
# Funkcja <tt>split</tt> dzieli pełną ścieżkę i zwraca krotkę zawierającą ścieżkę folderudo katalogu i nazwę pliku. Pamiętasz, jak mówiłem, że można używać przypisania wielu zmiennych do zwracania kilku wartości z funkcji? <tt>split</tt> jest taką właśnie funkcją.
# Przypisujesz wynik działania funkcji <tt>split</tt> krotce dwóch zmiennych. Każda zmienna będzie teraz zawierać wartość odpowiedniego elementu krotki zwróconej przez funkcję <tt>split</tt>.
# Pierwsza zmienna, <tt>filepath</tt>, zawiera pierwszy element krotki - ścieżkę pliku.
Linia 42:
# Moduł <tt>os.path</tt> zawiera też funkcję <tt>splitext</tt>, która zwraca krotkę zawierającą właściwą nazwę pliku i jego rozszerzenie. Używasz tej samej techniki, co poprzednio, do przypisania każdej części do osobnej zmiennej.
 
'''Przykład 6.18. Wyświetlanie zawartości folderukatalogu'''
 
>>> os.listdir("c:\\music\\_singles\\") #(1)
Linia 65:
'System Volume Information', 'TEMP', 'WINNT']
 
# Funkcja <tt>listdir</tt> pobiera ścieżkę do folderukatalogu i zwraca listę jego zawartości.
# <tt>listdir</tt> zwraca zarówno pliki jak i folderykatalogi, bez wskazania które są którymi.
# Możesz użyć filtrowania listy i funkcji <tt>isfile</tt> modułu <tt>os.path</tt> aby oddzielić pliki od folderówkatalogów. <tt>isfile</tt> pobiera ścieżkę i zwraca <tt>1</tt>, jeśli reprezentuje ona plik albo <tt>0</tt> w innym przypadku. W przykładzie używamy <tt>os.path.join</tt> aby uzyskać pełną ścieżkę, ale <tt>isfile</tt> pracuje też z częściowymi ścieżkami względnymi wobec bieżącego katalogu. Możesz użyć <tt>os.getcwd()</tt> aby pobrać bieżący katalog.
# <tt>os.path</tt> zawiera też funkcję <tt>isdir</tt>, zwracającą <tt>1</tt> jeśli ścieżka reprezentuje folderkatalog i <tt>0</tt> w innym przypadku. Możesz jej użyć do uzyskania listy podfolderówpodkatalogów.
 
'''Przykład 6.19. Listowanie zawartości folderukatalogu w <tt>fileinfo.py</tt>'''
 
def listDirectory(directory, fileExtList):
Linia 80:
if os.path.splitext(f)[1] in fileExtList] #(3) (4) (5)
 
# <tt>os.listdir(directory)</tt> zwraca listę wszystkich plików i folderówpodkatalogów w folderzekatalogu <tt>directory</tt>.
# Iterując po liście z użyciem zmiennej <tt>f</tt>, wykorzystujemy <tt>os.path.normcase(f)</tt>, aby znormalizować wielkość liter zgodnie z domyślnym systemem operacyjnym. Funkcja <tt>normcase</tt> jest użyteczną, prostą funkcją, która stanowi równoważnik pomiędzy systemami operacyjnymi, w których wielkość liter w nazwie pliku nie ma znaczenia, w którym np. <tt class="lang-none">mahadeva.mp3</tt> i <tt class="lang-none">mahadeva.MP3</tt> są takimi samymi plikami. Na przykład w Windowsie i Mac OS, <tt>normcase</tt> będzie konwertował całą nazwę pliku na małe litery, w systemach kompatybilnych z UNIX-em funkcja ta będzie zwracała niezmienioną nazwę pliku.
# Iterując ponownie po liście z użyciem <tt>f</tt>, wykorzystujemy <tt>os.path.splitext(f)</tt>, aby podzielić nazwę pliku na nazwę i jej rozszerzenie.
Linia 87:
 
{{Infobox|
Jeślli to możliwe, powinieneś używać funkcji z modułów <tt>os</tt> i <tt>os.path</tt> do manipulacji plikami, folderamikatalogami i ścieżkami. Te moduły opakowują moduły specyficzne dla konkretnego systemu, więc funkcje takie, jak <tt>os.path.split</tt> działają w systemach UNIX, Windows, Mac OS i we wszystkich innych systemach wspieranych przeprzez Pythona.
}}
 
Jest jeszcze jedna metoda dostania się do zawartości folderukatalogu. Jest bardzo potężna i używa zestawu symboli wieloznacznych, z którymi mogłeś się spotkać pracując w linii komend.
 
'''Przykład 6.20. Listowanie zawartości folderukatalogu przy pomocy <tt>glob</tt>'''
 
>>> os.listdir("c:\\music\\_singles\\") #(1)
Linia 111:
>>> glob.glob('c:\\music\\*\\*.mp3') #(4)
 
# Jak wcześniej powiedzieliśmy, <tt>os.listdir</tt> pobiera ścieżkę do folderukatalogu i zwraca wszystkie pliki i folderypodkatalogi, które się w nim znajdują.
# Z drugiej strony, moduł <tt>glob</tt> na podstawie podanego wyrażenia (ang. ''wildcard''), zwraca pełne ścieżki wszystkich plików, które spełniają te wyrażenie. Tutaj wyrażenie jest ścieżką do katalogu plus "*.mp3", który będzie dopasowywał wszystkie pliki <tt class="lang-none">.mp3</tt>. Dodajmy, że każdy element zwracanej listy jest już pełną ścieżką do pliku.
# Jeśli chcesz znaleźć wszystkie pliki w określonym folderzekatalogu, gdzie nazwa zaczyna się od "s", a kończy na ".mp3", możesz to zrobić w ten sposób.
# Teraz rozważ taki scenariusz: mamy folderkatalog z muzyką z kilkoma podfolderamipodkatalogami, wewnątrz których są pliki <tt class="lang-none">.mp3</tt>. Możemy pobrać listę wszystkich tych plików za pomocą jednego wywołania <tt>glob</tt>, wykorzystując połączenie dwóch wyrażeń. Pierwszym jest <tt>"*.mp3"</tt> (wyszukuje pliki .mp3), a drugim są same w sobie ścieżki do katalogów, aby przetworzyć każdy podkatalog w <tt class="lang-none">c:\music</tt>. Ta prosto wyglądająca funkcja daje nam niesamowite możliwości!
 
<noinclude>