Работа с табличными данными в 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)
Пояснение шагов:
pd.read_csv- загружает CSV-файл, автоматически распознавая разделители.pd.read_excel- читает лист Excel; можно указатьsheet_nameпо имени или индексу..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 требует предварительной сортировки данных, иначе группировка будет некорректной. Этот подход эффективен при малом количестве уникальных групп.