Таблицы в 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() для массовой вставки.
- Python столбец таблицы (столбец таблицы в python)
- Python 3 таблица (таблица в python 3)
- язык программирования python таблица (таблица в языке python)

Дополнительные примеры и нестандартные сценарии

Объединение нескольких таблиц в 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)

Работа с таблицами в Python - comments

En
Python работа с таблицами (python)