Назад к статьям

Экспорт данных: работа с JSON, CSV и базами данных

Привет! Ты спарсил кучу данных, и теперь возникает вопрос: куда это всё сохранить? В этой статье разберём все популярные форматы и способы хранения данных. 📦

JSON — универсальный формат

JSON — это как универсальный язык для данных. Все его понимают, и он легко читается. Идеален для небольших объёмов данных:

import json # Сохраняем данные в JSON data = [ {'name': 'Товар 1', 'price': 1000, 'rating': 4.5}, {'name': 'Товар 2', 'price': 2000, 'rating': 4.8}, ] # Простое сохранение with open('products.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=2) # Или одной строкой (без форматирования) json_string = json.dumps(data, ensure_ascii=False) # Чтение with open('products.json', 'r', encoding='utf-8') as f: loaded_data = json.load(f) print(loaded_data)

CSV — для таблиц и Excel

CSV — это как Excel, но проще. Отлично подходит для табличных данных:

import csv # Сохраняем в CSV data = [ ['Название', 'Цена', 'Рейтинг'], ['Товар 1', 1000, 4.5], ['Товар 2', 2000, 4.8], ] with open('products.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerows(data) # Или через DictWriter (удобнее) products = [ {'name': 'Товар 1', 'price': 1000, 'rating': 4.5}, {'name': 'Товар 2', 'price': 2000, 'rating': 4.8}, ] with open('products.csv', 'w', newline='', encoding='utf-8') as f: fieldnames = ['name', 'price', 'rating'] writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() writer.writerows(products) # Чтение with open('products.csv', 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: print(row)

Excel — для красоты

Если нужен красивый Excel файл с форматированием, используй openpyxl или pandas:

# pip install openpyxl pandas import pandas as pd # Создаём DataFrame df = pd.DataFrame([ {'Название': 'Товар 1', 'Цена': 1000, 'Рейтинг': 4.5}, {'Название': 'Товар 2', 'Цена': 2000, 'Рейтинг': 4.8}, ]) # Сохраняем в Excel df.to_excel('products.xlsx', index=False, engine='openpyxl') # Чтение df = pd.read_excel('products.xlsx') print(df)

SQLite — простая база данных

SQLite — это база данных в одном файле. Не требует установки сервера, идеальна для небольших проектов:

import sqlite3 # Создаём базу данных conn = sqlite3.connect('products.db') cursor = conn.cursor() # Создаём таблицу cursor.execute(''' CREATE TABLE IF NOT EXISTS products ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, price REAL, rating REAL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''') # Вставляем данные products = [ ('Товар 1', 1000, 4.5), ('Товар 2', 2000, 4.8), ] cursor.executemany( 'INSERT INTO products (name, price, rating) VALUES (?, ?, ?)', products ) conn.commit() # Читаем данные cursor.execute('SELECT * FROM products') rows = cursor.fetchall() for row in rows: print(row) conn.close()

PostgreSQL — для серьёзных проектов

Если данных много и нужна производительность, используй PostgreSQL:

# pip install psycopg2 import psycopg2 from psycopg2.extras import execute_values # Подключение conn = psycopg2.connect( host="localhost", database="parsing_db", user="user", password="password" ) cursor = conn.cursor() # Создаём таблицу cursor.execute(''' CREATE TABLE IF NOT EXISTS products ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, price DECIMAL(10, 2), rating DECIMAL(3, 2), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''') # Массовая вставка (быстро!) products = [ ('Товар 1', 1000, 4.5), ('Товар 2', 2000, 4.8), ] execute_values( cursor, 'INSERT INTO products (name, price, rating) VALUES %s', products ) conn.commit() cursor.close() conn.close()

Универсальная функция экспорта

Создадим функцию, которая сохраняет данные в любой формат:

def export_data(data, filename, format='json'): """Универсальная функция экспорта""" if format == 'json': with open(f'{filename}.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=2) elif format == 'csv': import csv with open(f'{filename}.csv', 'w', newline='', encoding='utf-8') as f: if data: writer = csv.DictWriter(f, fieldnames=data[0].keys()) writer.writeheader() writer.writerows(data) elif format == 'excel': import pandas as pd df = pd.DataFrame(data) df.to_excel(f'{filename}.xlsx', index=False) elif format == 'sqlite': import sqlite3 conn = sqlite3.connect(f'{filename}.db') cursor = conn.cursor() if data: # Создаём таблицу на основе ключей первого элемента keys = list(data[0].keys()) columns = ', '.join([f'{k} TEXT' for k in keys]) cursor.execute(f'CREATE TABLE IF NOT EXISTS data ({columns})') # Вставляем данные for item in data: values = [str(v) for v in item.values()] placeholders = ', '.join(['?' for _ in values]) cursor.execute(f'INSERT INTO data VALUES ({placeholders})', values) conn.commit() conn.close() print(f"Данные сохранены в {filename}.{format}") # Использование data = [{'name': 'Товар 1', 'price': 1000}] export_data(data, 'products', 'json') export_data(data, 'products', 'csv') export_data(data, 'products', 'excel')

Итоги

Выбор формата зависит от задачи: JSON для простых данных, CSV для таблиц, SQLite для небольших БД, PostgreSQL для больших объёмов. Главное — сохранять данные регулярно, чтобы не потерять результаты парсинга! 💾