File I/O, Data Formats, and Image Processing
From the CS50: Introduction to Computer Science curriculum
TL;DR
Nauczysz się, jak programy czytają i zapisują dane do plików, co pozwala im na trwałe przechowywanie informacji. Poznasz różne formaty danych, takie jak tekstowe i binarne, oraz zrozumiesz ich znaczenie w przechowywaniu danych. Przyjrzymy się również, jak te koncepcje są stosowane w przetwarzaniu obrazów, otwierając drzwi do manipulowania grafiką.
1. The Mental Model
Pomyśl o plikach jak o kartotekach, w których programy mogą zapisywać i odczytywać informacje. Format danych to sposób, w jaki te informacje są zorganizowane wewnątrz kartoteki. Przetwarzanie obrazów to nic innego jak programowe czytanie i zmienianie tych kartotek, aby tworzyć nowe obrazy lub modyfikować istniejące.
2. The Core Material
Obsługa Plików (File I/O)

Photo by Zulfugar Karimov on Pexels
Obsługa plików (Input/Output) to fundamentalna umiejętność w programowaniu, która pozwala programom komunikować się z systemem plików komputera. Możemy otwierać pliki do czytania, pisania lub dodawania (append).
Gdy otwierasz plik, musisz określić tryb:
* "r": tryb odczytu (read) – plik musi istnieć.
* "w": tryb zapisu (write) – tworzy nowy plik lub nadpisuje istniejący.
* "a": tryb dodawania (append) – dodaje dane na koniec istniejącego pliku; jeśli plik nie istnieje, zostanie utworzony.
* "rb", "wb", "ab": tryby binarne (read binary, write binary, append binary) – do pracy z danymi binarnymi, np. obrazami.
Zawsze pamiętaj, aby zamknąć plik po zakończeniu pracy, aby zwolnić zasoby i zapisać zmiany. W Pythonie często używa się konstrukcji with open(...), która automatycznie zamyka plik.
# Przykład zapisu do pliku tekstowego
with open("moj_plik.txt", "w") as f:
f.write("Cześć CS50!\n")
f.write("To jest druga linia.")
# Przykład odczytu z pliku tekstowego
with open("moj_plik.txt", "r") as f:
zawartosc = f.read()
print(zawartosc)
# Odczyt linia po linii
with open("moj_plik.txt", "r") as f:
for line in f:
print(line.strip()) # .strip() usuwa białe znaki, w tym znak nowej linii
Formaty Danych

Photo by Ann H on Pexels
Dane mogą być przechowywane w różnych formatach. Rozróżniamy głównie formaty tekstowe i binarne.
-
Formaty tekstowe: Przechowują dane jako czytelny tekst. Są łatwe do debugowania i modyfikowania przez człowieka. Przykłady:
.txt,.csv(Comma Separated Values),.json(JavaScript Object Notation),.xml.```python
import csvZapis do pliku CSV
dane = [
["Imię", "Wiek"],
["Anna", 25],
["Bartek", 30]
]
with open("ludzie.csv", "w", newline='') as f:
writer = csv.writer(f)
writer.writerows(dane)Odczyt z pliku CSV
with open("ludzie.csv", "r") as f:
reader = csv.reader(f)
for row in reader:
print(row)
```json { "name": "Jan Kowalski", "age": 30, "isStudent": false, "courses": ["CS50", "Algorytmy"] } -
Formaty binarne: Przechowują dane w postaci binarnej (sekwencji bajtów), która nie jest bezpośrednio czytelna dla człowieka. Są zazwyczaj bardziej kompaktowe i szybsze do przetwarzania przez programy. Przykłady:
.jpg,.png,.mp3,.exe.
Przetwarzanie Obrazów

Photo by RDNE Stock project on Pexels
Obrazy cyfrowe są zazwyczaj reprezentowane jako siatki pikseli (bitmapy). Każdy piksel ma określony kolor. Kolory są często kodowane za pomocą kombinacji wartości czerwonego, zielonego i niebieskiego (RGB), gdzie każda składowa ma wartość od 0 do 255.
Otwierając plik obrazu, program odczytuje tę binarną strukturę danych i interpretuje ją jako piksele. Możemy wtedy zmieniać poszczególne piksele lub wykonywać operacje na całym obrazie, takie jak:
* Zmiana rozmiaru (skalowanie)
* Zmiana jasności/kontrastu
* Filtrowanie (np. rozmycie, wyostrzenie)
* Konwersja na odcienie szarości
graph TD
A["Otwórz Plik Obrazu (np. JPG/PNG)"] --> B{"Czytaj Dane Binarne"}
B --> C["Dekoduj Nagłówek Pliku"]
C --> D{"Pobierz Szerokość, Wysokość, Głębię Kolorów"}
D --> E{"Pętla przez Dane Pikseli"}
E --> F["Odczytaj Wartości RGB dla każdego Piksela"]
F --> G["Modyfikuj Wartości RGB (np. odcienie szarości)"]
G --> H["Zapisz Nowe Wartości Pikseli"]
H --> I["Zakoduj Dane Obrazu"]
I --> J["Zapisz Nowy Plik Obrazu"]
W CS50 często używa się bibliotek, takich jak Pillow (PIL) w Pythonie, do łatwiejszego przetwarzania obrazów, bez konieczności ręcznego zarządzania bajtami.
from PIL import Image
# Otwórz obraz
try:
img = Image.open("obrazek.png")
print(f"Rozmiar obrazka: {img.width}x{img.height}")
# Konwertuj na odcienie szarości
szary_obraz = img.convert("L")
# Zapisz zmieniony obraz
szary_obraz.save("obrazek_szary.png")
print("Obrazek został przekonwertowany na odcienie szarości i zapisany jako 'obrazek_szary.png'.")
except FileNotFoundError:
print("Upewnij się, że plik 'obrazek.png' znajduje się w tym samym katalogu.")
except Exception as e:
print(f"Wystąpił błąd: {e}")
3. Worked Example
Załóżmy, że mamy plik CSV o nazwie oceny.csv z następującą zawartością:
Student,Ocena
Alicja,85
Piotr,92
Maria,78
Chcemy napisać program, który odczyta te oceny, obliczy średnią i zapisze ją do nowego pliku tekstowego wyniki.txt.
import csv
# Krok 1: Odczyt danych z pliku oceny.csv
oceny = []
try:
with open("oceny.csv", "r", newline='') as infile:
reader = csv.reader(infile)
header = next(reader) # Pomijamy nagłówek
for row in reader:
if len(row) == 2: # Upewnij się, że wiersz ma oczekiwaną liczbę kolumn
try:
oceny.append(int(row[1]))
except ValueError:
print(f"Pominięto nieprawidłową ocenę: {row[1]}")
except FileNotFoundError:
print("Błąd: Plik 'oceny.csv' nie został znaleziony.")
exit()
except Exception as e:
print(f"Wystąpił błąd podczas odczytu pliku CSV: {e}")
exit()
# Krok 2: Oblicz średnią
if oceny:
srednia_ocena = sum(oceny) / len(oceny)
else:
srednia_ocena = 0
print("Brak ocen do obliczenia średniej.")
# Krok 3: Zapis wyników do pliku wyniki.txt
try:
with open("wyniki.txt", "w") as outfile:
outfile.write(f"Wczytano oceny: {oceny}\n")
outfile.write(f"Średnia ocena: {srednia_ocena:.2f}\n") # Formatowanie do 2 miejsc po przecinku
print("Wyniki zostały zapisane do pliku 'wyniki.txt'.")
except Exception as e:
print(f"Wystąpił błąd podczas zapisu do pliku: {e}")
# Sprawdź zawartość pliku wyniki.txt (opcjonalnie)
try:
with open("wyniki.txt", "r") as f:
print("\nZawartość pliku wyniki.txt:")
print(f.read())
except FileNotFoundError:
pass # Już obsłużono powyżej, jeśli plik nie powstał
Ten program najpierw otwiera plik oceny.csv, odczytuje wartości ocen, ignorując nagłówek i ewentualne błędy konwersji, oblicza ich średnią, a następnie zapisuje wynik do nowego pliku wyniki.txt.
4. Key Takeaways
- Obsługa plików pozwala programom na trwałe przechowywanie i odczytywanie danych.
- Zawsze pamiętaj, aby zamknąć plik po zakończeniu pracy, używając
with open(...)dla bezpieczeństwa. - Formaty tekstowe (np.
.txt,.csv,.json) są czytelne dla człowieka i łatwe w debugowaniu. - Formaty binarne (np.
.jpg,.png) są kompaktowe i optymalne dla programów, ale trudniejsze do bezpośredniego odczytu. - Obrazy cyfrowe to zbiory pikseli, każdy z własnymi wartościami kolorów (np. RGB).
- Biblioteki (np. Pillow w Pythonie) znacznie ułatwiają przetwarzanie obrazów, abstrahując od niskopoziomowej obsługi bajtów.
- Wybór odpowiedniego formatu danych zależy od tego, czy dane mają być czytelne dla człowieka, czy efektywne dla programu.
Common Mistakes
- Niezamykanie plików: Może prowadzić do utraty danych, błędów lub wyczerpania zasobów systemowych.
- Brak obsługi błędów: Ignorowanie sytuacji, w których plik nie istnieje (
FileNotFoundError) lub dane są w niewłaściwym formacie (ValueError). - Używanie niewłaściwego trybu: Próba zapisu do pliku otwartego w trybie
rlub odczytu z pliku otwartego w trybiew(który może go nadpisać). - Mylenie trybu tekstowego z binarnym: Próba otwarcia pliku binarnego w trybie tekstowym lub na odwrót, co prowadzi do błędów dekodowania.
5. Now Try It
Stwórz plik tekstowy o nazwie moje_liczby.txt, który będzie zawierał po jednej liczbie całkowitej w każdej linii (np. 5, 12, 7, 20). Następnie napisz program w Pythonie, który:
1. Odczyta wszystkie liczby z moje_liczby.txt.
2. Obliczy ich sumę.
3. Zapisze sumę do nowego pliku o nazwie suma_liczb.txt w formacie: "Suma liczb wynosi: [tutaj suma]".
Co powinno się udać: Po uruchomieniu programu, w katalogu, w którym znajduje się Twój skrypt Pythona, powinien pojawić się plik suma_liczb.txt, a jego zawartość powinna poprawnie wyświetlać sumę liczb z moje_liczby.txt. Jeśli moje_liczby.txt nie istnieje, program powinien wyświetlić zrozumiały komunikat o błędzie.
Frequently asked about File I/O, Data Formats, and Image Processing
Study this next
Get the full CS50: Introduction to Computer Science curriculum
Clone the complete plan to your dashboard for unlimited AI-generated notes, practice quizzes, and a personalised revision schedule.
Create Free Account