Таблицы в Python: инструменты и практические примеры
Введение
Работа с табличными данными - одна из самых частых задач при разработке на Python. В языке существует несколько способов читать, обрабатывать и сохранять таблицы. В статье рассматриваются основные варианты: использование библиотеки pandas (наиболее эффективный подход), встроенного модуля csv, библиотеки openpyxl для Excel и встроенного модуля sqlite3 для баз данных. Каждый вариант сопровождается вопросом, примерами кода и описанием возможных проблем.
Как эффективно обрабатывать табличные данные в Python?
Основной инструмент - библиотека pandas. Она предоставляет структуру DataFrame, которая позволяет загружать, фильтровать, преобразовывать и анализировать таблицы из различных источников (CSV, Excel, SQL, JSON и др.).
import pandas as pd
# Загрузка данных из CSV
url = 'https://example.com/data.csv'
df = pd.read_csv(url)
# Просмотр первых строк
print(df.head())
# Фильтрация по условию
filtered = df[df['year'] > 2020]
# Группировка и агрегация
grouped = df.groupby('category')['value'].sum()
# Сохранение результата
filtered.to_csv('result.csv', index=False)библиотека таблиц python (библиотека для работы с таблицами в python)
Пояснения:
pd.read_csv()- загрузка CSV с автоматическим определением разделителя, заголовков и типов данных.df.head()- вывод первых 5 строк для проверки.- Фильтрация с использованием булевой индексации.
groupby- группировка для последующего суммирования или других агрегаций.to_csv()- сохранение результата без лишнего столбца индекса.
Частые проблемы и их решение:
- Ошибка кодировки: при загрузке CSV с кириллицей укажите
encoding='utf-8'или'cp1251'. - Пропуски в данных: используйте
df.dropna()илиdf.fillna(value). - Нехватка памяти: для больших файлов применяйте параметр
chunksizeвread_csv()или обрабатывайте данные порциями.
Как читать и записывать CSV без внешних библиотек?
Встроенный модуль csv подходит для простых операций, когда не требуется продвинутая обработка типов данных.
import csv
# Чтение данных
with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f) # или csv.reader для списков
rows = list(reader)
# Вывод первой строки
print(rows[0])
# Запись новых данных
with open('output.csv', 'w', encoding='utf-8', newline='') as f:
fieldnames = ['name', 'age', 'city']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'name': 'Иван', 'age': 30, 'city': 'Москва'})Python вывести таблицу (вывод таблицы в python)
Пояснения:
csv.DictReader- читает строки как словари, используя первую строку как заголовки.newline=''- предотвращает появление пустых строк в Windows.writeheader()записывает заголовки.
Типичные ошибки:
- Все данные - строки. Числа и даты нужно преобразовывать вручную (
int(),datetime.strptime()). - Проблемы с разделителем: если в CSV используется точка с запятой, передайте параметр
delimiter=';'.
Как работать с файлами Excel (.xlsx)?
Библиотека openpyxl позволяет читать, редактировать и создавать таблицы Excel с поддержкой форматирования, формул и стилей.
from openpyxl import load_workbook
# Загрузка существующего файла
wb = load_workbook('data.xlsx')
ws = wb.active # активный лист
# Чтение ячейки
cell_value = ws['A1'].value
print(cell_value)
# Итерация по строкам
for row in ws.iter_rows(min_row=2, values_only=True):
name, score = row
print(name, score)
# Создание нового листа
ws2 = wb.create_sheet('Новый лист')
ws2['B2'] = 42
# Сохранение
wb.save('updated.xlsx')таблица python задача (задача на таблицу в python)
Пояснения:
load_workbook()открывает книгу.iter_rows(values_only=True)возвращает значения без формул.- Доступ к ячейкам возможен как по координатам, так и по номерам строк/столбцов через
cell(row, column).
Возможные проблемы:
- Большие файлы: openpyxl может тормозить при тысячах строк. Для больших объёмов используйте pandas с движком
openpyxlилиxlrd(только для .xls). - Формулы:
ws['A1'].valueможет вернуть строку формулы, а не результат. Чтобы получить вычисленное значение, установитеdata_only=Trueпри загрузке.
Как обрабатывать таблицы в SQLite как обычные таблицы?
Встроенный модуль sqlite3 позволяет создавать и запрашивать реляционные таблицы непосредственно в памяти или файле.
import sqlite3
# Подключение к базе (файл mydb.db)
conn = sqlite3.connect('mydb.db')
cursor = conn.cursor()
# Создание таблицы
cursor.execute('''
CREATE TABLE IF NOT EXISTS employees (
id INTEGER PRIMARY KEY,
name TEXT,
salary REAL
)
''')
# Вставка данных
cursor.execute("INSERT INTO employees VALUES (1, 'Анна', 75000)")
conn.commit()
# Выборка
cursor.execute("SELECT * FROM employees WHERE salary > 70000")
rows = cursor.fetchall()
for row in rows:
print(row)
# Закрытие соединения
conn.close()Пояснения:
connect()создаёт файл базы, если его нет.cursor.execute()выполняет SQL-запрос. Для вставки лучше использовать подстановку?для защиты от инъекций.commit()сохраняет изменения.
Частые ошибки:
- Забытый commit: данные не сохраняются без
conn.commit(). - Типы данных: SQLite динамически типизирован, но лучше явно указывать типы при создании.
- Работа с несколькими запросами: используйте
executemany()для массовой вставки.
Дополнительные примеры и нестандартные сценарии
Объединение нескольких таблиц в pandas
import pandas as pd
orders = pd.DataFrame({
'order_id': [1, 2, 3],
'customer': ['Alice', 'Bob', 'Charlie']
})
items = pd.DataFrame({
'order_id': [1, 2, 2, 3],
'product': ['Laptop', 'Mouse', 'Keyboard', 'Monitor'],
'price': [1000, 25, 50, 300]
})
# Внутреннее соединение по order_id
merged = pd.merge(orders, items, on='order_id', how='inner')
print(merged)order_id customer product price 0 1 Alice Laptop 1000 1 2 Bob Mouse 25 2 2 Bob Keyboard 50 3 3 Charlie Monitor 300
Работа с пропущенными значениями и временными рядами
import pandas as pd
import numpy as np
dates = pd.date_range('2025-01-01', periods=5, freq='D')
df = pd.DataFrame({'date': dates, 'value': [10, np.nan, 30, 40, np.nan]})
df['value'] = df['value'].interpolate() # линейная интерполяция
print(df)date value 0 2025-01-01 10.0 1 2025-01-02 20.0 2 2025-01-03 30.0 3 2025-01-04 40.0 4 2025-01-05 40.0
# Заполнение последним известным значением (ffill)
df['value'] = df['value'].fillna(method='ffill')Экспорт в Excel с настраиваемым форматированием через openpyxl
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
wb = Workbook()
ws = wb.active
ws.title = 'Отчёт'
# Заголовки
headers = ['Название', 'Цена', 'Остаток']
for col, header in enumerate(headers, 1):
cell = ws.cell(row=1, column=col, value=header)
cell.font = Font(bold=True, color='FFFFFF')
cell.fill = PatternFill(start_color='4F81BD', end_color='4F81BD', fill_type='solid')
cell.alignment = Alignment(horizontal='center')
# Данные
data = [('Товар A', 150, 10), ('Товар B', 200, 5), ('Товар C', 300, 2)]
for row_idx, (name, price, stock) in enumerate(data, 2):
ws.cell(row=row_idx, column=1, value=name)
ws.cell(row=row_idx, column=2, value=price).number_format = '#,##0.00'
ws.cell(row=row_idx, column=3, value=stock)
# Автоширина колонок (приблизительно)
for col in [1,2,3]:
ws.column_dimensions[ws.cell(row=1, column=col).column_letter].width = 15
wb.save('formatted_report.xlsx')Сложные SQL-запросы в sqlite3 с параметрами
import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute('''CREATE TABLE sales (
id INTEGER PRIMARY KEY,
product TEXT,
quantity INTEGER,
price REAL,
date TEXT
)''')
c.executemany('INSERT INTO sales VALUES (?,?,?,?,?)', [
(1, 'Laptop', 2, 1000, '2025-01-10'),
(2, 'Mouse', 10, 25, '2025-01-11'),
(3, 'Keyboard', 5, 50, '2025-01-12'),
(4, 'Laptop', 1, 1000, '2025-01-13')
])
conn.commit()
# Выборка суммы продаж по продуктам с условием по дате
c.execute('''SELECT product, SUM(quantity * price) AS total
FROM sales
WHERE date BETWEEN '2025-01-10' AND '2025-01-12'
GROUP BY product
HAVING total > 200
ORDER BY total DESC''')
results = c.fetchall()
print(results)[('Laptop', 2000.0), ('Keyboard', 250.0)]Пакетная обработка CSV с регулярными выражениями (модуль csv + re)
import csv
import re
with open('contacts.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
cleaned = []
for row in reader:
# Удаление лишних пробелов и нецифровых символов из телефона
phone = re.sub(r'\D', '', row['phone'])
row['phone'] = phone
cleaned.append(row)
with open('contacts_clean.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.DictWriter(f, fieldnames=reader.fieldnames)
writer.writeheader()
writer.writerows(cleaned)