Last modified: June 14, 2024
This article is written in: 馃嚨馃嚤
Praca z plikami i folderami
Biblioteka standardowa Pythona oferuje szereg funkcji i narz臋dzi do efektywnej pracy z plikami i folderami. Dzi臋ki tym narz臋dziom, skrypty Pythona mog膮 by膰 u偶ywane do automatyzacji r贸偶nych zada艅, od prostych czynno艣ci biurowych po bardziej zaawansowane operacje na danych.
Otwarcie i zamkni臋cie pliku
Aby otworzy膰 plik w Pythonie, u偶ywamy funkcji open()
. G艂贸wne argumenty tej funkcji to 艣cie偶ka do pliku oraz tryb otwarcia. Wa偶ne jest, aby po pracy z plikiem odpowiednio go zamkn膮膰, co mo偶na zrealizowa膰 za pomoc膮 metody close()
. Zalecane jest korzystanie z konstrukcji with
, kt贸ra automatycznie dba o poprawne zamkni臋cie pliku.
# Otwarcie pliku w trybie odczytu
plik = open("sciezka/do/pliku.txt", "r")
# ... operacje na pliku ...
plik.close()
# Alternatywna metoda z u偶yciem with
with open("sciezka/do/pliku.txt", "r") as plik:
# ... operacje na pliku ...
Do dyspozycji mamy r贸偶ne tryby otwarcia pliku:
r
- odczyt pliku.r+
- odczyt i modyfikacja pliku.w
- zapis do pliku (usuni臋cie istniej膮cej tre艣ci i zapis nowej).a
- dopisanie do pliku (bez usuwania istniej膮cej tre艣ci).
Odczytywanie i zapisywanie danych z/do pliku
Odczytanie ca艂ego pliku mo偶na zrealizowa膰 za pomoc膮 metody readlines(), kt贸ra zwr贸ci list臋 linii z pliku. Ka偶dy element tej listy to napis reprezentuj膮cy kolejny wiersz. Zapis danych do pliku odbywa si臋 przy u偶yciu metody write().
with open("sciezka/do/pliku.txt", "r") as plik:
# Odczytanie zawarto艣ci pliku
wiersze = plik.readlines()
for wiersz in wiersze:
print(wiersz.strip()) # strip()
usuwa znaki ko艅ca linii
# Zapis nowych danych do pliku
with open("sciezka/do/pliku.txt", "w") as plik:
plik.write("nowy tekst\nwiersz nr. 2\n")
Pami臋tajmy, aby wybiera膰 odpowiedni tryb otwarcia pliku zale偶nie od planowanych operacji!
Modu艂 pathlib
Wsp贸艂czesna praca z plikami i folderami w Pythonie sta艂a si臋 znacznie bardziej intuicyjna i wydajna dzi臋ki wprowadzeniu modu艂u pathlib
w wersji 3.4. Zamiast manipulowania 艣cie偶kami jako zwyk艂ymi 艂a艅cuchami znak贸w, pathlib
pozwala na reprezentowanie 艣cie偶ek jako obiekt贸w z wieloma u偶ytecznymi metodami.
Oto kilka podstawowych metod dost臋pnych w klasie Path
:
.exists()
- sprawdza, czy dana 艣cie偶ka istnieje..is_file()
- sprawdza, czy 艣cie偶ka wskazuje na plik..is_dir()
- sprawdza, czy 艣cie偶ka wskazuje na folder..read_text()
- odczytuje zawarto艣膰 pliku jako tekst..write_text()
- zapisuje tekst do pliku..open()
- otwiera plik w okre艣lonym trybie (domy艣lnie w trybie odczytu 'r').
Poni偶ej przedstawiam, jak u偶ywa膰 wymienionych metod:
from pathlib import Path
sciezka = Path("/sciezka/do/pliku.txt")
if sciezka.exists():
print("Plik istnieje.")
else:
print("Plik nie istnieje.")
zawartosc = sciezka.read_text()
print(zawartosc)
sciezka.write_text("Nowy tekst w pliku.")
Reprezentowanie folderu jest r贸wnie proste:
folder = Path("/sciezka/do/folderu")
for element in folder.iterdir():
print(element)
Dzi臋ki obiektowemu podej艣ciu pathlib, mo偶emy 艂atwo sprawdzi膰, czy dany obiekt to plik czy folder:
if element.is_file():
print("To jest plik.")
elif element.is_dir():
print("To jest folder.")
pathlib
oferuje r贸wnie偶 wiele innych przydatnych metod, takich jak:
.mkdir()
- tworzy nowy folder..rename()
- zmienia nazw臋 pliku lub folderu..glob()
- wyszukuje pliki i foldery wed艂ug podanego wzorca.
Przyk艂ad u偶ycia .mkdir()
i sprawdzenia istnienia folderu:
if not folder.exists():
folder.mkdir(parents=True, exist_ok=True)
Parametr parents=True
sprawia, 偶e zostan膮 utworzone wszystkie nieistniej膮ce foldery nadrz臋dne, a exist_ok=True
zapobiega b艂臋dom, je艣li folder ju偶 istnieje.
Por贸wnanie modu艂贸w pathlib
i os
Funkcjonalno艣膰 | pathlib |
os |
Bie偶膮cy katalog roboczy | Path.cwd() |
os.getcwd() |
Katalog domowy | Path.home() |
os.path.expanduser("~") |
Sprawdzanie istnienia | Path('/some/path').exists() |
os.path.exists('/some/path') |
Sprawdzanie katalogu | Path('/some/path').is_dir() |
os.path.isdir('/some/path') |
Sprawdzanie pliku | Path('/some/path').is_file() |
os.path.isfile('/some/path') |
Tworzenie katalogu | Path('/new/dir').mkdir(parents=True, exist_ok=True) |
os.makedirs('/new/dir', exist_ok=True) |
Usuwanie katalogu | Path('/some/dir').rmdir() |
os.rmdir('/some/dir') |
Usuwanie pliku | Path('/some/file').unlink() |
os.remove('/some/file') |
Zmiana nazwy | Path('/old/name').rename('/new/name') |
os.rename('/old/name', '/new/name') |
Odczyt tekstu z pliku | Path('/some/file').read_text() |
with open('/some/file') as f: content = f.read() |
Zapis tekstu do pliku | Path('/some/file').write_text('New content') |
with open('/some/file', 'w') as f: f.write('New content') |
Odczyt bajt贸w z pliku | Path('/some/file').read_bytes() |
with open('/some/file', 'rb') as f: content = f.read() |
Zapis bajt贸w do pliku | Path('/some/file').write_bytes(b'New content') |
with open('/some/file', 'wb') as f: f.write(b'New content') |
Iterowanie przez katalog | for item in Path('.').iterdir(): print(item) |
for item in os.listdir('.'): print(item) |
Wzorzec glob | for p in Path('.').glob('*.txt'): print(p) |
import glob; for p in glob.glob('*.txt'): print(p) |
Rekurencyjny glob | for p in Path('.').rglob('*.txt'): print(p) |
import glob; for p in glob.iglob('**/*.txt', recursive=True): print(p) |
Absolutna 艣cie偶ka | abs_path = Path('some/relative/path').resolve() |
abs_path = os.path.abspath('some/relative/path') |
Modu艂 pathlib
oferuje bardziej nowoczesne, obiektowe podej艣cie do pracy z systemem plik贸w, podczas gdy os
i os.path
dostarczaj膮 bardziej tradycyjne, proceduralne metody. pathlib
jest zazwyczaj bardziej intuicyjny i czytelny, szczeg贸lnie dla operacji na 艣cie偶kach plik贸w.