Python: как записать и прочитать CSV-файл

Категория: Python · Язык: Python · Обновлено:

Для работы с CSV в Python есть стандартный модуль csv. Записывать строки удобно через csv.writer или csv.DictWriter, читать через csv.reader или csv.DictReader. Файл всегда открывайте с параметрами newline="" и encoding.

Записать список строк

Python
import csv

rows = [
    ["Название", "Цена", "Остаток"],
    ["Хлеб", 45, 12],
    ["Молоко, 3.2%", 90, 7],
]

with open("goods.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerows(rows)

Значение с запятой внутри, например Молоко, 3.2%, модуль сам заключит в кавычки. Параметр newline="" нужен, чтобы на Windows не появлялись пустые строки между записями.

Прочитать файл

Python
with open("goods.csv", newline="", encoding="utf-8") as f:
    for row in csv.reader(f):
        print(row)

Все значения читаются как строки. Числа нужно приводить вручную: int(row[1]).

Работа со словарями

DictWriter и DictReader позволяют обращаться к столбцам по названию:

Python
goods = [
    {"name": "Хлеб", "price": 45},
    {"name": "Сыр", "price": 450},
]

with open("prices.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["name", "price"])
    writer.writeheader()
    writer.writerows(goods)

with open("prices.csv", newline="", encoding="utf-8") as f:
    items = list(csv.DictReader(f))

print(items[0])                       # {'name': 'Хлеб', 'price': '45'}
print(sum(int(i["price"]) for i in items))  # 495

CSV для Excel

Русская версия Excel ожидает точку с запятой и кодировку UTF-8 с BOM. Иначе кириллица превращается в нечитаемые символы:

Python
with open("for_excel.csv", "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.writer(f, delimiter=";")
    writer.writerow(["Имя", "Город"])
    writer.writerow(["Анна", "Казань"])

with open("for_excel.csv", encoding="utf-8-sig") as f:
    print(f.read().splitlines()[1])  # Анна;Казань

Другие разделители

Файл

Параметр

Точка с запятой

delimiter=";"

Табуляция (TSV)

delimiter="\t"

Все значения в кавычках

quoting=csv.QUOTE_ALL

Добавить строку в конец файла

Python
with open("goods.csv", "a", newline="", encoding="utf-8") as f:
    csv.writer(f).writerow(["Чай", 120, 30])

with open("goods.csv", newline="", encoding="utf-8") as f:
    print(len(list(csv.reader(f))))  # 4

Частые вопросы

Почему при чтении числа остаются строками?

Формат CSV не хранит типы. csv возвращает текст, и преобразование в числа и даты нужно сделать самостоятельно или использовать библиотеку pandas.

Как прочитать большой CSV, не загружая его целиком?

Перебирайте csv.reader в цикле: он отдаёт строки по одной и не читает весь файл в память.