Работа с табличными данными в Python: от CSV до Excel

Раздел: Обработка данных -> Работа с электронными таблицами

Электронные таблицы в Python: основные подходы

Работа с электронными таблицами (Excel, CSV, ODS) является повседневной задачей для многих разработчиков и аналитиков данных. Python предлагает несколько мощных библиотек, каждая из которых подходит для определенного сценария. В этой статье рассмотрены основные способы чтения, обработки и записи табличных данных.

Как универсально обрабатывать данные из Excel и CSV с помощью pandas?

pandas - это основная библиотека для анализа данных. Она поддерживает чтение и запись Excel, CSV, а также многих других форматов. Для работы с Excel потребуется дополнительный движок (openpyxl или xlrd).

import pandas as pd

# Чтение CSV
csv_df = pd.read_csv('data.csv', encoding='utf-8')
# Чтение Excel (по умолчанию первый лист)
excel_df = pd.read_excel('report.xlsx', sheet_name=0)
# Запись в Excel
csv_df.to_excel('output.xlsx', index=False, sheet_name='Data')

электронная таблица python (электронная таблица в python)

Пояснение шагов:

  1. pd.read_csv - загружает CSV-файл, автоматически распознавая разделители.
  2. pd.read_excel - читает лист Excel; можно указать sheet_name по имени или индексу.
  3. .to_excel - сохраняет DataFrame в Excel, параметр index=False убирает строки индекса.

Типичные ошибки:

  • Отсутствие движка: ModuleNotFoundError: No module named 'openpyxl' - установите pip install openpyxl.
  • Проблемы с кодировкой: для CSV укажите encoding='cp1251' для русских текстов.

Цели использования: pandas идеально подходит для анализа, фильтрации, группировки и объединения данных. Быстро обрабатывает большие объёмы (до нескольких миллионов строк).

Как напрямую работать с ячейками и форматированием Excel через openpyxl?

openpyxl позволяет читать и изменять файлы Excel формата .xlsx на уровне отдельных клеток, стилей, формул и диаграмм.

from openpyxl import load_workbook

wb = load_workbook('template.xlsx')
ws = wb['Sheet1']
ws['A1'] = 'Привет'
ws['B2'] = 123
# Применение стиля
from openpyxl.styles import Font
ws['A1'].font = Font(bold=True, color='FF0000')
wb.save('modified.xlsx')

Пояснение:

  • load_workbook - открывает существующий файл.
  • ws['координата'] - доступ к ячейке.
  • Изменения сохраняются через save.

Типичные ошибки: Если файл открыт в Excel, может возникнуть ошибка Permission denied. Также openpyxl не поддерживает .xls (старый формат).

Когда использовать: когда нужно создать сложный отчет с объединенными ячейками, условным форматированием, формулами или вставить диаграмму непосредственно в Excel.

Как создать новый Excel-файл с продвинутым форматированием через xlsxwriter?

xlsxwriter специализируется на создании .xlsx файлов с высокой производительностью и богатыми возможностями форматирования (гистограммы, условное форматирование, автоподбор ширины).

import xlsxwriter

workbook = xlsxwriter.Workbook('new.xlsx')
worksheet = workbook.add_worksheet('Report')

# Формат с жирным шрифтом и рамкой
bold = workbook.add_format({'bold': True, 'border': 1})
worksheet.write('A1', 'Имя', bold)
worksheet.write('B1', 'Оценка', bold)
worksheet.write_column('A2', ['Анна', 'Борис', 'Виктор'])
worksheet.write_column('B2', [85, 92, 78])

# Условное форматирование (данные уже записаны)
worksheet.conditional_format('B2:B4', {
    'type': '2_color_scale',
    'min_color': '#FF0000',
    'max_color': '#00FF00'
})

workbook.close()

Примечание: xlsxwriter не может читать существующие файлы, только создавать новые. Для доступа к ячейкам после записи используйте только методы write.

Распространённые проблемы: если вызвать write после close, будет ошибка. Не забудьте закрыть книгу.

Случаи использования: создание отчётов с диаграммами, спарклайнами, сложными цветовыми схемами. Подходит для больших объёмов данных (более 100 тысяч строк).

Как обрабатывать простые CSV-файлы без дополнительных библиотек?

Стандартный модуль csv из состава Python подходит для базового чтения и записи CSV без установки сторонних пакетов.

import csv

with open('data.csv', 'r', encoding='utf-8') as f:
    reader = csv.DictReader(f, delimiter=';')
    for row in reader:
        print(row['Name'], row['Value'])

with open('out.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['Name', 'Age'])
    writer.writerow(['Аня', 25])

Пояснение:

  • csv.DictReader читает строки как словари, используя первую строку как заголовки.
  • csv.writer записывает строки списками.

Ошибки: неправильная кодировка - используйте encoding='utf-8-sig' для файлов с BOM. Также проверяйте разделитель (delimiter), иначе данные будут в одной колонке.

Когда выбрать: для простого импорта/экспорта данных, когда не требуется мощный анализ. Быстрее pandas для малых объёмов.

Расширенные примеры работы с таблицами

Пример 1. Чтение Excel с несколькими листами и объединение

Пример
import pandas as pd

# Загрузка всех листов в словарь DataFrame-ов
all_sheets = pd.read_excel('sales.xlsx', sheet_name=None)

# Объединение всех листов в один DataFrame
combined = pd.concat(all_sheets.values(), ignore_index=True)

# Группировка и вывод суммы
grouped = combined.groupby('Product')['Revenue'].sum()
print(grouped)
Product
Laptop    15000
Mouse      3200
...
Name: Revenue, dtype: int64

Пояснение: Параметр sheet_name=None возвращает словарь с именем листа и DataFrame. pd.concat объединяет все части в одну таблицу.

Проблема: если листы имеют разные столбцы, pd.concat заполнит пропуски NaN. Это нормально, но можно использовать join='inner' для пересечения.

Пример 2. Создание отчёта с формулами и диаграммой в openpyxl

Пример
from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference

wb = Workbook()
ws = wb.active
ws.title = 'Sales'

# Заголовки и данные
ws.append(['Category', 'Quantity'])
data = [
    ['Apples', 30],
    ['Oranges', 50],
    ['Bananas', 20]
]
for row in data:
    ws.append(row)

# Формула суммы
ws['A5'] = 'Total'
ws['B5'] = '=SUM(B2:B4)'

# Создание диаграммы
chart = BarChart()
chart.add_data(Reference(ws, min_col=2, min_row=2, max_row=4))
chart.set_categories(Reference(ws, min_col=1, min_row=2, max_row=4))
ws.add_chart(chart, 'D2')

wb.save('sales_report.xlsx')

Результат: файл с гистограммой и автосуммой.

Возможная ошибка: если данные не непрерывные, диаграмма может строиться неправильно. Убедитесь, что диапазоны ссылок корректны.

Пример 3. Обработка большого CSV с разбивкой на чанки (pandas)
Пример
chunk_size = 10000
result = []
for chunk in pd.read_csv('huge.csv', chunksize=chunk_size):
    # Фильтрация: только строки, где колонка 'status' == 'active'
    filtered = chunk[chunk['status'] == 'active']
    result.append(filtered)
    print(f'Обработан фрагмент размером {len(chunk)}')

final_df = pd.concat(result)
print(final_df.shape)
Обработан фрагмент размером 10000
Обработан фрагмент размером 10000
...
(250000, 8)

Примечание: Чанкинг позволяет обрабатывать файлы, не умещающиеся в оперативной памяти. Можно выполнять агрегацию на лету.

Ещё один нераспространённый приём: одновременное использование модуля csv и itertools для потоковой обработки:

Пример
import csv, itertools

with open('large.csv') as f:
    reader = csv.DictReader(f)
    # Группировка по полю 'department'
    for dept, group in itertools.groupby(reader, key=lambda x: x['department']):
        print(dept, sum(int(r['salary']) for r in group))
IT 245000
Sales 180000
...

Пояснение: itertools.groupby требует предварительной сортировки данных, иначе группировка будет некорректной. Этот подход эффективен при малом количестве уникальных групп.

Электронная таблица в Python - comments

En
электронная таблица python (python)