Fișiere CSV
Unul dintre formatele de fișiere frecvent utilizate pentru stocarea informațiilor într-un mod convenabil este formatul CSV. Fiecare linie dintr-un fișier CSV reprezintă o înregistrare sau un rând separat, care constă din coloane individuale, separate prin virgule. De aceea, formatul este numit Comma Separated Values. Deși formatul CSV este un format de fișiere text, Python, pentru a facilita lucrul cu acesta, oferă un modul încorporat special numit csv.
Să analizăm utilizarea acestui modul printr-un exemplu:
import csv
FILENAME = "users.csv"
users = [
["Tom", 28],
["Alice", 23],
["Bob", 34]
]
with open(FILENAME, "w", newline="") as file:
writer = csv.writer(file)
writer.writerows(users)
with open(FILENAME, "a", newline="") as file:
user = ["Sam", 31]
writer = csv.writer(file)
writer.writerow(user)
În fișier se înregistrează o listă bidimensională - practic un tabel, unde fiecare rând reprezintă un utilizator. Fiecare utilizator conține două câmpuri: nume și vârstă. Deci, practic, avem un tabel format din trei rânduri și două coloane.
La deschiderea fișierului pentru scriere, ca al treilea parametru, se specifică valoarea newline="" - un șir gol care permite citirea corectă a rândurilor din fișier, indiferent de sistemul de operare.
Pentru a scrie, trebuie să obținem un obiect writer, care este returnat de funcția csv.writer(file). În această funcție se transmite fișierul deschis. Scrierea propriu-zisă se face prin metoda writer.writerows(users). Această metodă primește un set de rânduri. În cazul nostru, este vorba de o listă bidimensională.
Dacă trebuie să adăugăm un singur rând, care reprezintă o listă unidimensională, de exemplu, ["Sam", 31], putem apela metoda writer.writerow(user).
În final, după rularea scriptului, în același director va apărea fișierul users.csv, care va avea următorul conținut:
Tom,28
Alice,23
Bob,34
Sam,31
Pentru citirea din fișier, trebuie să creăm un obiect reader:
import csv
FILENAME = "users.csv"
with open(FILENAME, "r", newline="") as file:
reader = csv.reader(file)
for row in reader:
print(row[0], " - ", row[1])
După obținerea obiectului reader, putem itera prin toate rândurile sale:
Tom - 28
Alice - 23
Bob - 34
Sam - 31
Lucrul cu dicționare
În exemplul de mai sus, fiecare înregistrare sau rând reprezenta o listă separată, de exemplu, ["Sam", 31]. Cu toate acestea, modulul csv oferă funcționalități suplimentare pentru lucrul cu dicționare. În special, funcția csv.DictWriter() returnează un obiect writer care permite scrierea în fișier, iar funcția csv.DictReader() returnează un obiect reader pentru citirea din fișier. De exemplu:
import csv
FILENAME = "users2.csv"
users = [
{"name": "Tom", "age": 28},
{"name": "Alice", "age": 23},
{"name": "Bob", "age": 34}
]
with open(FILENAME, "w", newline="") as file:
columns = ["name", "age"]
writer = csv.DictWriter(file, fieldnames=columns)
writer.writeheader()
# scrierea mai multor rânduri
writer.writerows(users)
user = {"name" : "Sam", "age": 41}
# scrierea unui singur rând
writer.writerow(user)
with open(FILENAME, "r", newline="") as file:
reader = csv.DictReader(file)
for row in reader:
print(row["name"], "-", row["age"])
Scrierea rândurilor se face tot prin metodele writerow() și writerows(). Dar acum, fiecare rând reprezintă un dicționar separat și, în plus, se scriu și anteturile coloanelor cu ajutorul metodei writeheader(), iar în metoda csv.DictWriter se transmite ca al doilea parametru setul de coloane.
La citirea rândurilor, folosind numele coloanelor, putem accesa valorile individuale dintr-un rând: row["name"].