Файли CSV Python
Одним з поширених файлових форматів, які зберігають в зручному вигляді інформацію, є формат csv. Кожен рядок у файлі csv представляє окрему запис або рядок, який складається з окремих стовпців, розділених комами. Власне тому формат і називається Comma Separated Values. Але хоча формат csv - це формат текстових файлів, Python для спрощення роботи з ним надає спеціальний вбудований модуль csv.
Розглянемо роботу модуля на прикладі:
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)
У файл записується двомірний список - фактично таблиця, де кожен рядок являє одного користувача. А кожен користувач містить два поля - ім'я та вік. Тобто фактично таблиця з трьох рядків і двох стовпців.
При відкритті файлу на запис у якості третього параметра вказується значення newline="" - порожній рядок дозволяє коректно зчитувати рядки з файлу незалежно від операційної системи.
Для запису нам треба отримати об'єкт writer, який повертається функцією csv.writer(file). В цю функцію передається відкритий файл. А власне запис проводиться за допомогою методу writer.writerows(users) - цей метод приймає набір рядків. У нашому випадку це двомірний список.
Якщо необхідно додати один запис, який являє собою одновимірний список, наприклад, ["Sam", 31], то в цьому випадку можна викликати метод writer.writerow(user).
У підсумку після виконання скрипта в тій же папці виявиться файл users.csv, який буде мати такий вміст:
Tom,28
Alice,23
Bob,34
Sam,31
Для читання з файлу нам навпаки потрібно створити об'єкт 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])
При отриманні об'єкта reader ми можемо в циклі перебрати всі його рядки:
Alice - 23
Bob - 34
Sam - 31
Робота зі словниками
У прикладі вище кожен запис або рядок являв собою окремий список, наприклад, ["Sam", 31]. Але крім того, модуль csv має спеціальні додаткові можливості для роботи зі словниками. Зокрема, функція csv.DictWriter() повертає об'єкт writer, який дозволяє записувати в файл. А функція csv.DictReader() повертає об'єкт reader для читання з файлу. Наприклад:
import csv
FILENAME = " users.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()
# запис декількох рядків
writer.writerows(users)
user = {"name" : "Sam", "age": 41}
# запис одного рядка
writer.writerow(user)
with open(FILENAME, "r", newline="") as file:
reader = csv.DictReader(file)
for row in reader:
print(row["name"], "-", row["age"])
Запис рядків також проводиться за допомогою методів writerow() і writerows(). Але тепер кожен рядок являє собою окремий словник, і крім того, проводиться запис і заголовків стовпців за допомогою методу writeheader(), а в метод csv.DictWriter в якості другого параметра передається набір стовпців.
При читанні рядків, використовуючи назви стовпців, ми можемо звернутися до окремих значень всередині рядка: row ["name"].