раздел 03 · подстраница 1

CSV, Excel и Google Sheets

Главная суперсила CSV - его понимают и программы, и таблицы. Один и тот же файл ваш код пишет программно, а человек открывает двойным кликом в Excel и правит руками. Это мост между разработкой и обычными людьми, которые живут в таблицах.

CSV это не то же самое, что Excel

Тут легко запутаться. CSV - это простой текстовый формат. Excel-файл (.xlsx) - это сложный бинарный формат с формулами, цветами, несколькими листами и графиками.

| | CSV (.csv) | Excel (.xlsx) | | --- | --- | --- | | Что внутри | обычный текст | бинарный архив | | Формулы, цвета | нет | да | | Несколько листов | нет, один | да | | Открыть в блокноте | да, всё читаемо | нет, мусор | | Читать в коде | очень просто | нужна библиотека |

Excel умеет открывать и сохранять CSV - поэтому их часто путают. Но CSV хранит только сами данные, без оформления и формул. Для обмена данными это плюс: ничего лишнего.

Как отдать пользователю таблицу

Частая задача: пользователь нажимает «Экспорт», получает файл, открывает в Excel. CSV - самый простой способ это сделать.

import csv

def export_orders(orders, path="orders.csv"):
    with open(path, "w", newline="", encoding="utf-8-sig") as f:
        writer = csv.DictWriter(f, fieldnames=["id", "client", "total"])
        writer.writeheader()
        writer.writerows(orders)

Заметьте кодировку utf-8-sig - это важный трюк для Excel, о нём ниже.

Главная боль: Excel и кодировка

Если открыть обычный UTF-8 CSV в Excel на Windows двойным кликом, русский текст часто превращается в кракозябры (Ð�cнна вместо Анна). Excel по умолчанию ждёт другую кодировку.

Разделитель: запятая или точка с запятой

Ещё одна засада с Excel в русской локали. В странах, где десятичный разделитель - запятая (3,14), Excel ожидает в CSV разделитель столбцов точку с запятой (;), а не запятую. Иначе он свалит всю строку в один столбец.

name;age;city
Анна;28;Москва

Поэтому многие выгрузки из российских систем используют ;. При чтении это надо учитывать:

reader = csv.DictReader(f, delimiter=";")   # явно указываем разделитель

Google Sheets

Google Sheets дружелюбнее к UTF-8: импорт CSV (Файл → Импорт) обычно проходит без танцев с кодировкой. А ещё Sheets умеет отдавать таблицу как CSV по ссылке - удобно, когда нужно простое «облачное» хранилище, которое редактируют не-программисты, а программа просто скачивает свежий CSV.

Когда таблицы достаточно как «базы данных»

Честно: для многих маленьких проектов Google Sheets - вполне рабочая «база данных». Несколько человек редактируют, программа читает по API. Это нормальный старт, пока:

  • данных не десятки тысяч строк;
  • не нужен сложный поиск и связи между таблицами;
  • одновременных правок немного.

Когда упрётесь в эти границы - пора в настоящую базу (раздел 05).

Антипаттерны

  • Слать пользователям UTF-8 CSV без BOM и удивляться кракозябрам. Используйте utf-8-sig или предупреждайте, как открывать.
  • Жёстко зашивать разделитель ,, когда данные приходят с ;. Проверяйте, чем реально разделён файл.
  • Путать .csv и .xlsx. Если нужны формулы, несколько листов и оформление - это Excel, и для записи .xlsx из кода нужна отдельная библиотека (например, openpyxl).