Python • kurs podstawowy • lekcja 26
Pliki CSV
CSV zapisuje dane tabelaryczne: pierwszy wiersz może zawierać nagłówki, a następne wartości kolumn.
Twój cel: Zapiszesz tabelę CSV i odczytasz jej pola przez DictReader z właściwą konwersją.Odczyt plików i listy słowników.
Co ma zrobić program?
Przecinek wewnątrz pola musi być odróżniony od separatora. Dlatego używamy modułu csv, zamiast samodzielnie dzielić linie przez split(",").
DictWriter otrzymuje plik i fieldnames — nazwy oraz kolejność kolumn. writeheader zapisuje nagłówek, a writerows listę rekordów. DictReader odczytuje nagłówki i daje słownik dla każdego wiersza. W domyślnym trybie odczytane pola są napisami: liczba 6 zapisana do CSV wróci jako "6".
Plik otwieramy z encoding="utf-8" i newline="", aby moduł csv zarządzał końcami wierszy. Domyślny separator to przecinek. Dla pliku ze średnikami ustaw delimiter=";" w czytniku i pisarzu. Nagłówki muszą pasować do kluczy używanych w kodzie. Ćwiczymy na osobnym pliku, bo tryb w nadpisuje dane.
Przewidź przed uruchomieniem
import csv
rows = [{"name": "Sok, jabłkowy", "price": 6}]
with open("products.csv", "w", encoding="utf-8", newline="") as file:
writer = csv.DictWriter(file, fieldnames=["name", "price"])
writer.writeheader()
writer.writerows(rows)
with open("products.csv", encoding="utf-8", newline="") as file:
for row in csv.DictReader(file):
print(row["name"])
print(int(row["price"]) + 1)
Porównaj wynik i prześledź mechanizm
Moduł zapisze pole z przecinkiem w odpowiednich cudzysłowach, więc nazwa pozostanie jednym polem. Wynik to Sok, jabłkowy oraz 7. DictReader daje price jako str; int umożliwia dodawanie.
Wynik kontrolny dla danych z przykładu. Wpisane odpowiedzi użytkownika nie są tutaj powtarzane:
Sok, jabłkowy
7
| Warstwa | name | price |
|---|---|---|
| Słownik przed zapisem | Sok, jabłkowy | 6 — int |
| CSV | "Sok, jabłkowy" | 6 — tekst w pliku |
| DictReader | Sok, jabłkowy | "6" — str |
| Konwersja ceny | bez zmiany | 6 — int |
Zmień działający program
Odczytaj plik utworzony przez przykład i oblicz sumę cen. Nie dodawaj nagłówka do sumy.
Pierwsza wskazówka
Zachowaj działający punkt wyjścia. Zlokalizuj konstrukcję wskazaną w poleceniu i zmień tylko ten etap. Przed uruchomieniem zapisz oczekiwany efekt.
Porównaj swoją modyfikację
import csv
total = 0
with open("products.csv", encoding="utf-8", newline="") as file:
for row in csv.DictReader(file):
total = total + int(row["price"])
print(total)
Uruchom po głównym przykładzie, który tworzy potrzebny plik.
Wynik kontrolny dla danych z przykładu. Wpisane odpowiedzi użytkownika nie są tutaj powtarzane:
6
Znajdź przyczynę problemu
Celowo błędny przykład diagnostyczny. Najpierw postaw hipotezę. Nie kopiuj tej wersji jako poprawnego rozwiązania.
Zamierzone działanie: Odczytaj dwie kolumny pliku ze średnikami.
Plik ma nagłówek name;price, ale kod korzysta z csv.DictReader(file) bez podania separatora.
Trop do diagnozy
Porównaj zamierzony rezultat z typami, nazwami i kolejnością instrukcji. Wskaż pierwsze miejsce, w którym zachowanie odbiega od celu.
Zastosuj w nowej sytuacji
Wskazówka do rozpoczęcia
CSV potrzebuje zgodnych nagłówków i separatora. Po odczycie jawnie konwertuj pola do obliczeń.
Zacznij od przygotowania danych. Pierwsza instrukcja przykładowego rozwiązania:
import csv
Rozwiązanie do samodzielnej kontroli
import csv
books = [{"title": "Atlas", "copies": 2}, {"title": "Bajki", "copies": 3}]
with open("books.csv", "w", encoding="utf-8", newline="") as file:
writer = csv.DictWriter(file, fieldnames=["title", "copies"])
writer.writeheader()
writer.writerows(books)
total = 0
with open("books.csv", encoding="utf-8", newline="") as file:
for row in csv.DictReader(file):
total = total + int(row["copies"])
print(total)
Wynik kontrolny dla danych z przykładu. Wpisane odpowiedzi użytkownika nie są tutaj powtarzane:
5
Porównaj dane wejściowe, wynik i powód użycia konstrukcji. Inna wersja kodu jest poprawna, jeśli realizuje te same wymagania.
Co zabierasz do kolejnego programu?
CSV potrzebuje zgodnych nagłówków i separatora. Po odczycie jawnie konwertuj pola do obliczeń.
Bez zaglądania do przykładu wyjaśnij własnymi słowami, jak główna konstrukcja prowadzi od danych do wyniku. Potem sprawdź wyjaśnienie, uruchamiając swój program.