Zanurkuj w Pythonie/Praca z katalogami: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
Zdzichobot (dyskusja | edycje) zamiana {{Nawigacja|Python|->{{Nawigacja|Zanurkuj w Pythonie| [[Python/->[[../ |
poprawki |
||
Linia 1:
{{Podświetl|py}}▼
▲== 6.5. Praca z katalogami ==
Moduł <tt>os.path</tt> zawiera kilka funkcji służących do manipulacji plikami i katalogami. Przyjrzymy się teraz obsłudze ścieżek i odczytywaniu zawartości katalogów.▼
▲Moduł <
'''Przykład 6.16. Tworzenie ścieżek do plików'''▼
{{Python/Przykład
|tekst=
>>> import os
>>> os.path.join("c:\\music\\ap\\", "mahadeva.mp3") #(1) (2)
{{samp|'c:\\music\\ap\\mahadeva.mp3'}}
>>> os.path.join("c:\\music\\ap", "mahadeva.mp3") #(3)
{{samp|'c:\\music\\ap\\mahadeva.mp3'}}
>>> os.path.expanduser("~") #(4)
{{samp|'c:\\Documents and Settings\\mpilgrim\\My Documents'}}
>>> os.path.join(os.path.expanduser("~"), "Python") #(5)
{{samp|'c:\\Documents and Settings\\mpilgrim\\My Documents\\Python'}}
# <
# Funkcja <
# W tym, trochę bardziej skomplikowanym, przypadku, <
# <
# Używając tych technik,
}}
'''Przykład 6.17. Rozdzielanie ścieżek'''▼
{{Python/Przykład
|tekst=
>>> os.path.split("c:\\music\\ap\\mahadeva.mp3") #(1)
{{samp|('c:\\music\\ap', 'mahadeva.mp3')}}
>>> (filepath, filename) = os.path.split("c:\\music\\ap\\mahadeva.mp3") #(2)
>>> filepath #(3)
{{samp|'c:\\music\\ap'}}
>>> filename #(4)
{{samp|'mahadeva.mp3'}}
>>> (shortname, extension) = os.path.splitext(filename) #(5)
>>> shortname
{{samp|'mahadeva'}}
>>> extension
{{samp|'.mp3'}}
# Funkcja <tt>split</tt> dzieli pełną ścieżkę i zwraca krotkę zawierającą ścieżkę do 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.▼
# Druga zmienna, <tt>filename</tt>, zawiera drugi element krotki - nazwę pliku.▼
# 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.▼
▲# Funkcja <
'''Przykład 6.18. Wyświetlanie zawartości katalogu'''▼
▲# Przypisujesz wynik działania funkcji <
▲# Pierwsza zmienna, <
▲# Moduł <
}}
{{Python/Przykład
|tekst=
>>> os.listdir("c:\\music\\_singles\\") #(1)
{{samp|['a_time_long_forgotten_con.mp3', 'hellraiser.mp3',
'kairo.mp3', 'long_way_home1.mp3', 'sidewinder.mp3',
'spinning.mp3']}}
>>> dirname = "c:\\"
>>> os.listdir(dirname) #(2)
{{samp|['AUTOEXEC.BAT', 'boot.ini', 'CONFIG.SYS', 'cygwin',
'docbook', 'Documents and Settings', 'Incoming', 'Inetpub', 'IO.SYS',
'MSDOS.SYS', 'Music', 'NTDETECT.COM', 'ntldr', 'pagefile.sys',
'Program Files', 'Python20', 'RECYCLER',
'System Volume Information', 'TEMP', 'WINNT']}}
>>> [f for f in os.listdir(dirname)
... if os.path.isfile(os.path.join(dirname, f))] #(3)
{{samp|['AUTOEXEC.BAT', 'boot.ini', 'CONFIG.SYS', 'IO.SYS', 'MSDOS.SYS',
'NTDETECT.COM', 'ntldr', 'pagefile.sys']}}
>>> [f for f in os.listdir(dirname)
... if os.path.isdir(os.path.join(dirname, f))] #(4)
{{samp|['cygwin', 'docbook', 'Documents and Settings', 'Incoming',
'Inetpub', 'Music', 'Program Files', 'Python20', 'RECYCLER',
'System Volume Information', 'TEMP', 'WINNT']}}
# Funkcja <
# <
#
# <
}}
{{Python/Przykład
|tekst=
u"zwraca listę obiektów zawierających metadane dla plików o podanych rozszerzeniach"
fileList = [os.path.join(directory, f) for f in fileList▼
if os.path.splitext(f)[1] in fileExtList] #(3) (4) (5)</nowiki>▼
# <
▲ def listDirectory(directory, fileExtList):
# Iterując po liście z użyciem zmiennej <
# Iterując ponownie po liście z użyciem <
# Dla każdego pliku sprawdzamy, czy rozszerzenie jest w liście plików, o które nam chodzi (czyli <
▲ for f in os.listdir(directory)] #(1) (2)
# Dla każdego pliku, który nas interesuje, wykorzystujemy <
▲ fileList = [os.path.join(directory, f)
}}
▲ if os.path.splitext(f)[1] in fileExtList] #(3) (4) (5)
▲# <tt>os.listdir(directory)</tt> zwraca listę wszystkich plików i podkatalogów w katalogu <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.
▲# Dla każdego pliku sprawdzamy, czy rozszerzenie jest w liście plików, o które nam chodzi (czyli <tt>fileExtList</tt>, która została przekazana do <tt>listDirectory</tt>).
▲# Dla każdego pliku, który nas interesuje, wykorzystujemy <tt>os.path.join(directory, f)</tt>, aby skonstruować pełną ścieżkę pliku i zwrócić listę zawierającą pełne ścieżki.
{{Infobox|
}}
Jest jeszcze
{{Python/Przykład
|tekst=
>>> os.listdir("c:\\music\\_singles\\") #(1)
{{samp|['a_time_long_forgotten_con.mp3', 'hellraiser.mp3',
'kairo.mp3', 'long_way_home1.mp3', 'sidewinder.mp3',
'spinning.mp3']}}
>>> import glob
>>> glob.glob('c:\\music\\_singles\\*.mp3') #(2)
{{samp|['c:\\music\\_singles\\a_time_long_forgotten_con.mp3',
'c:\\music\\_singles\\hellraiser.mp3',
'c:\\music\\_singles\\kairo.mp3',
'c:\\music\\_singles\\long_way_home1.mp3',
'c:\\music\\_singles\\sidewinder.mp3',
'c:\\music\\_singles\\spinning.mp3']}}
>>> glob.glob('c:\\music\\_singles\\s*.mp3') #(3)
{{samp|['c:\\music\\_singles\\sidewinder.mp3',
'c:\\music\\_singles\\spinning.mp3']}}
>>> glob.glob('c:\\music\\*\\*.mp3') #(4)
# Jak wcześniej powiedzieliśmy, <
# Z drugiej strony, moduł <
# Jeśli
# Teraz rozważ taki scenariusz: mamy katalog z muzyką z kilkoma podkatalogami, wewnątrz których są pliki <tt
}}
<noinclude>
{{Nawigacja|Zanurkuj w Pythonie|
[[../Korzystanie_z_sys.modules|Korzystanie z <
[[../Wyjątki_i_operacje_na_plikach_-_wszystko_razem|Wszystko razem]]|
}}
▲{{Podświetl|py}}
</noinclude>
|