Praca z systemem plików to jedno z podstawowych zadań w programowaniu w Pythonie. Historycznie Python oferuje prostą i intuicyjną składnię do pracy z plikami, co pomogło mu stać się popularnym językiem do zadań automatyzacji, przetwarzania danych i rozwoju aplikacji webowych.
W wczesnych wersjach Pythona programiści uzyskiwali dostęp do systemu plików za pomocą wbudowanej funkcji open(). Wraz z wydaniem Pythona 2.5 wprowadzono protokół menedżera kontekstu, który pozwolił na bezpieczną pracę z zasobami za pomocą konstrukcji with, co zmniejszyło liczbę wycieków zasobów i błędów przy pracy z plikami.
Bez odpowiedniego podejścia do pracy z plikami można napotkać:
Współczesna, poprawna praca z plikami w Pythonie wykorzystuje menedżera kontekstu — konstrukcję with open():
with open('data.txt', 'r', encoding='utf-8') as file: data = file.read()
Gwarantuje to, że plik zostanie automatycznie zamknięty, nawet jeśli wystąpi błąd. Do zapisu używa się trybu 'w', do dołączania — 'a', do pracy z danymi binarnymi — 'rb', 'wb' itp. Do odczytu dużych plików najlepiej stosować iterację:
with open('big_data.txt', 'r', encoding='utf-8') as file: for line in file: process(line)
Kluczowe cechy:
'r', 'w', 'a', 'b', '+').read().Dlaczego używać menedżera kontekstu (with) przy otwieraniu pliku, skoro można po prostu wywołać file.close()?
Odpowiedź: Menedżer kontekstu gwarantuje zamknięcie pliku nawet w przypadku wystąpienia wyjątku. Ręczne wywołanie close() często bywa pomijane, zwłaszcza przy skomplikowanej logice lub w blokach z błędami, co prowadzi do wycieków zasobów.
Przykład kodu:
try: file = open('data.txt', 'r') data = file.read() finally: file.close()
To podejście jest bardziej skomplikowane niż użycie with open().
**Czy można zapisywać dane w pliku otwartym tylko w trybie 'r'?**
Odpowiedź: Nie, przy otwieraniu pliku w trybie 'r' zapis jest niemożliwy — wywołanie metod zapisu (`write`, `writelines`) spowoduje wyjątek `io.UnsupportedOperation`. Do zapisu użyj trybów 'w', 'a' lub 'r+'.
**Co się stanie, gdy otworzysz nieistniejący plik w trybie 'r'?**
Odpowiedź: Wystąpi wyjątek `FileNotFoundError`. Aby utworzyć nowy plik, użyj trybu 'w' (plik zostanie stworzony, jeśli go nie ma), lub 'a' (dołączanie), lub obsłuż wyjątek.
# Typowe błędy i antywzorce
- Otwieranie plików bez wyraźnego zamykania (`file = open(...); ...; file.close()`).
- Nieokreślone kodowanie przy pracy z danymi unicode.
- Użycie pełnego odczytu (`read()`), co prowadzi do zużycia całej pamięci na dużych plikach.
# Przykład z życia
## Negatywny przypadek
Programista otwiera kilka plików bez menedżerów kontekstu i zapomina zamknąć jeden z nich, co prowadzi do błędu "Too many open files" na serwerze.
**Zalety:**
- Szybka realizacja, mniej kodu.
**Wady:**
- Wyciek deskryptorów, awarie aplikacji w produkcji.
- Potencjalna utrata danych.
## Pozytywny przypadek
Użycie `with open()` dla każdego pliku, jawne określenie kodowania, przetwarzanie dużych plików linia po linii.
**Zalety:**
- Niezawodność, automatyczne zwalnianie zasobów.
- Łatwe do przeczytania, bezpieczne w utrzymaniu.
**Wady:**
- Wymaga nieco więcej początkowej dyscypliny i znajomości składni.