Посібник по Python

Файли 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 ми можемо в циклі перебрати всі його рядки:

Tom - 28
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"].