Harvard University CS50

File I/O, Data Formats, and Image Processing

SA
StudyAI Editorial
Reviewed by StudyAI tutors
· Published Updated

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)

Neatly arranged blue office binders labeled with dates and names for organized storage.
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

Wooden letters spelling 'INTRODUCTION' placed on a cardboard background.
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 csv

    Zapis 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

Tax forms laid out with a calculator and magnifying glass on a wooden surface, perfect for finance themes.
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 r lub odczytu z pliku otwartego w trybie w (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

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. Read the full notes above for the details.

File I/O, Data Formats, and Image Processing is a core topic in CS50: Introduction to Computer Science. Most exam papers test it via a mix of definitions, worked examples, and applied problems. The notes above cover the high-yield sub-topics, common pitfalls, and the kind of questions examiners typically set.

Yes — every note in the StudyAI Campus Hub is free to read in full, right here on this page, with no account needed. If you clone the plan into your own dashboard, the free plan shows a preview of each note there; Basic and above unlock the full notes in your dashboard, along with practice quizzes, flashcards and offline study. You can always come back here to read the complete note for free.
Continue with
Introduction to Web Development and Databases

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