Preview Mode

You're viewing this material in preview mode. Sign up to track your progress and access all features.

Pliki CSV
In Progress

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
CSV potrzebuje zgodnych nagłówków i separatora. Po odczycie jawnie konwertuj pola do obliczeń.
CSV potrzebuje zgodnych nagłówków i separatora. Po odczycie jawnie konwertuj pola do obliczeń.

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
Model do prześledzenia: porównaj każdy etap z kodem. Etykiety opisują znaczenie danych, nie tylko ich wygląd.

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.