csv
Odczyt i zapis plików CSV, czyli tabel zapisanych jako tekst, w których wartości oddziela przecinek lub średnik.
- Zwraca
readeriDictReaderzwracają iterator wierszy (list albo słowników), awriteriDictWriterobiekt z metodami zapisu.
Przykład
#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))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
#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 przezopen(..., 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. WDictWritersą wymagane i wyznaczają kolejność kolumn, wDictReaderopcjonalne, domyślnie brane z pierwszego wiersza.
Więcej przykładów
#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)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())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.
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=";")))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()lubfloat(), a liczby z przecinkiem dziesiętnym najpierw przezreplace(",", "."). - Do analizy dużych tabel wygodniejsza jest biblioteka pandas:
pd.read_csv("plik.csv", sep=";").
Powiązane hasła
#- open()Otwiera plik do odczytu lub zapisu i zwraca obiekt pliku.
- withMenedżer kontekstu: automatyczne przygotowanie i sprzątanie zasobów.
- jsonZamienia dane Pythona na tekst JSON i z powrotem. Podstawa zapisu danych i komunikacji z API.
- str.split()Dzieli napis na listę części według separatora.
- next()Pobiera następny element z iteratora. Po jego wyczerpaniu zwraca wartość domyślną albo zgłasza StopIteration.
- dict()Tworzy słownik z par klucz–wartość lub argumentów nazwanych.
Widzisz błąd albo brakuje przykładu? Napisz do nas.