Файлы CSV

Поділитись

Одним из распространенных файловых форматов, которые хранят в удобном виде информацию, является формат csv. Каждая строка в файле csv представляет отдельную запись или строку, которая состоит из отдельных столбцов, разделенных запятыми. Собственно поэтому формат и называется Comma Separated Values. Но хотя формат csv – это формат текстовых файлов, Python для упрощения работы с ним предоставляет специальный встроенный модуль csv.

Рассмотрим работу модуля на примере:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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, который будет иметь следующее содержимое:

1
2
3
4
Tom,28
Alice,23
Bob,34
Sam,31

Для чтения из файла нам наоборот нужно создать объект reader:

1
2
3
4
5
6
7
8
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 для чтения из файла. Например:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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)
or row in reader:
print(row["name"], "-", row["age"])

Запись строк также производится с помощью методов writerow() и writerows(). Но теперь каждая строка представляет собой отдельный словарь, и кроме того, производится запись и заголовков столбцов с помощью метода writeheader(), а в метод csv.DictWriter в качестве второго параметра передается набор столбцов.

При чтении строк, используя названия столбцов, мы можем обратиться к отдельным значениям внутри строки: row["name"].


Поділитись