csv

Odczyt i zapis plików CSV, czyli tabel zapisanych jako tekst, w których wartości oddziela przecinek lub średnik.

Zwraca
reader i DictReader zwracają iterator wierszy (list albo słowników), a writer i DictWriter obiekt z metodami zapisu.
Na tej stronie

Przykład

#
Python
import csv

students = [
    {"name": "Ania", "world": 7, "points": 250},
    {"name": "Kuba", "world": 2, "points": 80},
]

with open("wyniki.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=["name", "world", "points"])
    writer.writeheader()
    writer.writerows(students)

with open("wyniki.csv", newline="", encoding="utf-8") as file:
    rows = list(csv.DictReader(file))

print(rows[0])
print(sum(int(row["points"]) for row in rows))
Wynikzapisany wynik, możesz go sprawdzić
{'name': 'Ania', 'world': '7', 'points': '250'}
330

Plik wyniki.csv zawiera wiersz nagłówka name,world,points i dwa wiersze danych. Po odczycie wszystkie wartości są napisami, dlatego punkty trzeba zamienić przez int().

Definicja i zastosowanie

#

Moduł csv czyta i zapisuje pliki CSV, czyli tabele w postaci tekstu: każdy wiersz tabeli to jedna linia, a wartości oddziela separator, najczęściej przecinek. W tym formacie eksportują dane Excel, Arkusze Google i większość baz danych. Moduł poprawnie obsługuje wartości zawierające separator albo cudzysłów, które przy ręcznym dzieleniu przez split(",") łatwo zepsuć.

csv.reader zwraca kolejne wiersze jako listy napisów, a csv.DictReader jako słowniki, w których kluczami są nazwy kolumn z pierwszego wiersza. Do zapisu służą csv.writer z metodami writerow() i writerows() oraz csv.DictWriter, który nagłówek zapisuje metodą writeheader(). Wszystkie odczytane wartości są napisami, więc liczby zamieniasz samodzielnie przez int() albo float().

Plik otwieraj z argumentem newline="" i jawnym kodowaniem, np. encoding="utf-8". Bez newline="" w systemie Windows między wierszami pojawią się puste linie. Polska wersja Excela używa średnika jako separatora, co ustawisz parametrem delimiter=";", a polskie znaki wyświetli poprawnie, gdy plik zapiszesz w kodowaniu "utf-8-sig".

Składnia

#
Składnia
import csv

csv.reader(plik, delimiter=",")
csv.writer(plik, delimiter=",")
csv.DictReader(plik)
csv.DictWriter(plik, fieldnames=[...])

Parametry

#
  • plik

    obiekt pliku lub lista napisów

    Plik otwarty przez open(..., newline="") albo dowolna kolekcja kolejnych linii tekstu.
  • delimiter

    str, domyślnie ","

    Separator wartości, np. ";" dla plików z polskiej wersji Excela.
  • fieldnames

    lista napisów

    Nazwy kolumn. W DictWriter są wymagane i wyznaczają kolejność kolumn, w DictReader opcjonalne, domyślnie brane z pierwszego wiersza.

Więcej przykładów

#
Dlaczego nie wystarczy split(",")
Python
import csv

lines = [
    "name,course,review",
    'Ania,Python,"Świetny, polecam"',
    "Kuba,HTML,Dobry",
]

print(lines[1].split(","))
for row in csv.reader(lines):
    print(row)
Wynikzapisany wynik, możesz go sprawdzić
['Ania', 'Python', '"Świetny', ' polecam"']
['name', 'course', 'review']
['Ania', 'Python', 'Świetny, polecam']
['Kuba', 'HTML', 'Dobry']
Zapis ze średnikiem i cudzysłowami
Python
import csv
import io

buffer = io.StringIO()
writer = csv.writer(buffer, delimiter=";", lineterminator="\n")
writer.writerow(["kurs", "moduły", "opis"])
writer.writerow(["Python", 12, "Safari; Darwin"])
writer.writerow(["HTML", 11, 'Znaczniki "od zera"'])

print(buffer.getvalue())
Wynikzapisany wynik, możesz go sprawdzić
kurs;moduły;opis
Python;12;"Safari; Darwin"
HTML;11;"Znaczniki ""od zera"""

Wartość zawierająca separator trafia do cudzysłowu, a cudzysłów wewnątrz wartości zostaje podwojony. io.StringIO zbiera tu tekst w pamięci zamiast w pliku.

Plik dla polskiej wersji Excela
Python
import csv

with open("oceny.csv", "w", newline="", encoding="utf-8-sig") as file:
    writer = csv.writer(file, delimiter=";")
    writer.writerow(["Uczeń", "Ocena"])
    writer.writerow(["Łucja", 5])

with open("oceny.csv", newline="", encoding="utf-8-sig") as file:
    print(list(csv.reader(file, delimiter=";")))
Wynikzapisany wynik, możesz go sprawdzić
[['Uczeń', 'Ocena'], ['Łucja', '5']]

Kodowanie utf-8-sig dodaje na początku pliku niewidoczny znacznik BOM, po którym Excel rozpoznaje UTF-8 i poprawnie wyświetla polskie litery.

Dobre praktyki

#
  • Otwieraj pliki CSV z newline="". Moduł sam obsługuje znaki końca linii, a bez tego w systemie Windows pojawią się puste wiersze.
  • Wartości z pliku są zawsze napisami. Liczby zamieniaj przez int() lub float(), a liczby z przecinkiem dziesiętnym najpierw przez replace(",", ".").
  • Do analizy dużych tabel wygodniejsza jest biblioteka pandas: pd.read_csv("plik.csv", sep=";").

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.