Moduł os i operacje na plikach i folderach

Stronę tą wyświetlono już: 388 razy

W module os znajduje się szereg funkcji umożliwiających pozyskiwanie informacji na temat plików i folderów znajdujących się na dysku twardym komputera a także tworzenie i usuwanie tychże plików. Z tego względu niezbędna jest następująca deklaracja z mojej strony:

Ponieważ niewłaściwe (celowe lub niecelowe) wykorzystanie funkcji opisanych na tej stronie może doprowadzić do utraty cennych danych lub uszkodzenia samego systemu niniejszym oświadczam, że za sposób wykorzystania opisanej tutaj wiedzy odpowiada tylko i wyłącznie Czytelnik. Tym samym zwalnia mnie to z odpowiedzialności za konsekwencje niepoprawnego wykorzystania tutaj opisanych funkcji.

Załadujmy na sam początek moduł os:

Listing 1
  1. import os

Pozyskiwanie bieżącej ścieżki dostępu za pomocą funkcji os.getcmd:

Listing 2
  1. print(os.getcmd())

Wynik działania powyższego kodu jest zależny od systemu, z jakiego korzysta użytkownik, niemniej jednak wyświetlić się powinna ścieżka do bieżącej lokalizacji, która pod Linuksem może wyglądać mniej więcej tak:

/home/user/

Z kolei pod Windowsem:

C:\Users\User

Zmiana ścieżki dostępu za pomocą funkcji os.chdir:

Listing 3
  1. os.chdir("jakiś folder")
  2. print(os.getcmd())

Oczywiście powyższy kod zadziała poprawnie jedynie, gdy w domyślnej ścieżce znajduje się folder o nazwie jakiś folder.

Uzyskanie listy plików i folderów zawartych w danej lokalizacji za pomocą funkcji os.listdir:

Listing 4
  1. l = list(os.listdir())
  2. print(l)

I tu zaczynają się schody, ponieważ powyższy kod z pewnością wykona się poprawnie pod Linuksem, ale pod Windowsem może się wyburaczyć, albowiem w konsoli tegoż systemu używane jest kodowanie cp852, natomiast pliki mogą mieć nazwy, zawierające symbole wykraczające poza zakres kodowania cp852. W znaczącej jednak liczbie przypadków pliki nie powinny zawierać takich znaków a tym samym powinna się wyświetlić lista plików i folderów.

Sprawdzanie, czy dana ścieżka jest poprawna za pomocą funkcji os.path.exist:

Listing 5
  1. os.path.exists("ścieżka do folderu lub pliku")

Powyższa funkcja zwraca True, gdy ścieżka jest poprawna, False w przeciwnym przypadku.

Sprawdzanie, czy dana ścieżka jest bezwzględna za pomocą funkcji os.path.isabs:

Listing 6
  1. os.path.isabs("ścieżka do folderu lub pliku")

Powyższa funkcja zwraca True, gdy ścieżka jest ścieżką absolutną, False w przeciwnym przypadku.

Sprawdzanie, czy dana ścieżka prowadzi do pliku za pomocą funkcji os.path.isfile:

Listing 7
  1. os.path.isfile("ścieżka do folderu lub pliku")

Powyższa funkcja zwraca True, gdy ścieżka prowadzi do pliku, False w przeciwnym przypadku.

Sprawdzanie, czy dana ścieżka prowadzi do folderu za pomocą funkcji os.path.isdir:

Listing 8
  1. os.path.isdir("ścieżka do folderu lub pliku")

Powyższa funkcja zwraca True, gdy ścieżka prowadzi do folderu, False w przeciwnym przypadku.

Sprawdzanie, czy dana ścieżka prowadzi do dysku za pomocą funkcji os.path.ismount:

Listing 9
  1. os.path.ismount("ścieżka, która może być dyskiem")

Powyższa funkcja zwraca True, gdy ścieżka prowadzi do dysku, False w przeciwnym przypadku.

Pozyskanie rozmiaru pliku w bajtach za pomocą funkcji os.path.getsize:

Listing 10
  1. os.path.getsize("ścieżka do folderu lub pliku")

Pozyskanie daty utworzenia pliku za pomocą funkcji os.path.getctime:

Listing 11
  1. import time
  2. f = open("plik.txt", "w", -1, "utf-8")
  3. f.write("Jakiś tam tekst")
  4. f.close()
  5. print(time.ctime(os.path.getctime("plik.txt")))

Wynik działania powyższego kodu:

Tue Apr 12 07:54:29 2016

Pozyskanie daty ostatniej modyfikacji pliku za pomocą funkcji os.path.getmtime:

Listing 12
  1. import time
  2. f = open("plik.txt", "w", -1, "utf-8")
  3. f.write("Jakiś tam tekst")
  4. f.close()
  5. print(time.ctime(os.path.getmtime("plik.txt")))

Wyciąganie ścieżki do pliku i nazwy pliku za pomocą funkcji os.path.split:

Listing 13
  1. print(os.path.split("/home/user/file.txt"))

Wynik działania:

('/home/user', 'file.txt')

Tworzenie nowego folderu za pomocą funkcji os.mkdir:

Listing 14
  1. os.mkdir("folder")
  2. if os.path.exists("folder"):
  3. print("Istnieje!")

Usuwanie folderu za pomocą funkcji os.rmdir:

Listing 15
  1. os.mkdir("folder")
  2. if os.path.exists("folder"):
  3. print("Istnieje!")
  4. os.rmdir("folder")
  5. if not os.path.exists("folder"):
  6. print("A teraz nie istnieje!")

Uwaga! Funkcja os.rmdir usunie folder jedynie gdy ten jest pusty.

Usuwanie pliku za pomocą funkcji os.remove:

Listing 16
  1. file = open("plik.txt","w", -1, "utf-8")
  2. file.write("jakiś tam tekst")
  3. file.close()
  4. os.remove("plik.txt")

Zmiana nazwy pliku lub folderu za pomocą funkcji os.rename:

Listing 17
  1. file = open("plik.txt","w", -1, "utf-8")
  2. file.write("jakiś tam tekst")
  3. file.close()
  4. os.rename("plik.txt","plik 2.txt")

Funkcję rename można również wykorzystać do przeniesienia pliku z jednej lokalizacji do drugiej:

Listing 18
  1. file = open("plik.txt","w", -1, "utf-8")
  2. file.write("jakiś tam tekst")
  3. file.close()
  4. os.mkdir("Folder na plik")
  5. os.rename("plik.txt","Folder na plik\plik 2.txt")

Jak widać funkcja ta może przenosić plik jednocześnie zmieniając jego nazwę.

Przeszukiwanie folderów i podfolderów za pomocą funkcji os.walk.

Funkcja os.walk zwraca trzy elementy: ścieżkę dostępu; listę folderów w niej znajdującą się i listę plików znajdujących się w tejże lokalizacji. Oto prosty skrypt, który tworzy plik FileData.txt i zapisuje w nim kolejne katalogi i pliki w nich zawarte:

Listing 19
  1. #!/usr/bin/env python
  2. # coding: utf-8
  3. import os
  4. f = open('FileData.txt', 'w', -1, 'utf-8')
  5. for path, subfiles, files in os.walk('.'):
  6. f.write('=' * 70 + 'n')
  7. f.write(path + 'n')
  8. if len(subfiles):
  9. f.write('=' * 70 + 'n')
  10. f.write('Podkatalogi:n' + '=' * 70 + 'n')
  11. for i in subfiles:
  12. f.write('n' + i)
  13. f.write('n')
  14. if len(files):
  15. f.write('=' * 70 + 'n')
  16. f.write('Pliki:n' + '=' * 70 + 'n')
  17. for i in files:
  18. f.write('n' + i)
  19. f.write('n')
  20. f.close()
  21. return 0

Komentarze