Привет! Я Иван, программист, и сегодня расскажу, как можно анализировать и даже кластеризовать текст с помощью Python и магического инструмента — библиотеки scikit-learn (sklearn). Это будет идеальный первый шаг, если вы хотите автоматизировать обработку отзывов, статей или любой другой текстовой информации.
## 1. Векторизация текста
Компьютеры любят числа! Нас же интересуют буквы, слова и тексты. Чтобы машинке было понятнее, переводим текст в числовой вид с помощью
Теперь каждый документ — это вектор из чисел, где каждое число отражает важность определенного слова.
## 2. Кластеризация: учим машину находить похожее
Допустим, у нас куча текстов, и надо понять — какие из них говорят об одном и том же. Для этого идеально подходит KMeans:
Каждому тексту присваивается номер кластера — теперь похожие тексты собраны вместе!
## 3. Мини-применение
Посмотрим, как распределились наши тексты:
Теперь вы знаете, как можно быстро превратить тексты в числа, и даже найти в них скрытые группы! Модули
Творите с Python — и пусть тексты больше не будут "тёмным лесом"!
## 1. Векторизация текста
Компьютеры любят числа! Нас же интересуют буквы, слова и тексты. Чтобы машинке было понятнее, переводим текст в числовой вид с помощью
CountVectorizer
или TfidfVectorizer
.from sklearn.feature_extraction.text import TfidfVectorizer
texts = [
"Python is easy to learn",
"Python and sklearn are powerful",
"Data science is fun"
]
vectorizer = TfidfVectorizer()
features = vectorizer.fit_transform(texts)
print(features.shape) # (3, 8): 3 документа, 8 уникальных слов
Теперь каждый документ — это вектор из чисел, где каждое число отражает важность определенного слова.
## 2. Кластеризация: учим машину находить похожее
Допустим, у нас куча текстов, и надо понять — какие из них говорят об одном и том же. Для этого идеально подходит KMeans:
from sklearn.cluster import KMeans
num_clusters = 2
kmeans = KMeans(n_clusters=num_clusters, random_state=42)
kmeans.fit(features)
print(kmeans.labels_) # Например: [0 0 1]
Каждому тексту присваивается номер кластера — теперь похожие тексты собраны вместе!
## 3. Мини-применение
Посмотрим, как распределились наши тексты:
for idx, label in enumerate(kmeans.labels_):
print(f"Text: '{texts[idx]}' — Cluster: {label}")
Теперь вы знаете, как можно быстро превратить тексты в числа, и даже найти в них скрытые группы! Модули
TfidfVectorizer
и KMeans
— отличный старт для анализа текстов: они просты в использовании, но мощные по возможностям.Творите с Python — и пусть тексты больше не будут "тёмным лесом"!
👍2
Привет! С вами Иван, и сегодня мы будем говорить о создании собственной сетевой "классной комнаты" с помощью Python и могучего Jitsi API. Если вы не слышали о Jitsi — это бесплатная и открытая платформа для видеоконференций, которую можно интегрировать в свой проект буквально "на коленке". А ведь сколько возможностей открывается: онлайн-уроки, дистанционные кружки, даже занятия английским по вечерам!
Jitsi: Видеозвонки из Python
Jitsi не имеет нативного Python SDK, но у него есть REST API и iframe интеграция. Самый простой путь — создавать "комнаты" и управлять ими через web-интерфейс Jitsi Meet, генерируя ссылки через Python.
### Создаём комнату и отправляем приглашение
Допустим, вам нужно создать виртуальный класс для учеников:
Этот код генерирует уникальное имя класса и выдаёт ссылку. Осталось только отправить её ученикам — хоть по email, хоть через чат-бота!
### Добавляем управление через API
А вот пример запроса к Jitsi Videobridge для получения статистики о комнатах (необходима авторизация):
Используя такие запросы, можно отслеживать загруженность сервера: если классов стало слишком много — поднимаем ещё один инстанс.
### Встраиваем Jitsi в веб-приложение
Jitsi легко добавляется на сайт через iframe. Python-проекты на Flask или Django могут генерировать HTML-шаблон с вашей уникальной комнатой:
Подставьте в
Вывод:
С помощью пары строк Python и мощи Jitsi можно быстро настроить интерактивные уроки, не разбираясь в сложных API и видеостримах. Экспериментируйте, и пусть ваши виртуальные классы всегда будут полны энтузиазма!
Jitsi: Видеозвонки из Python
Jitsi не имеет нативного Python SDK, но у него есть REST API и iframe интеграция. Самый простой путь — создавать "комнаты" и управлять ими через web-интерфейс Jitsi Meet, генерируя ссылки через Python.
### Создаём комнату и отправляем приглашение
Допустим, вам нужно создать виртуальный класс для учеников:
import random
import string
def generate_room_name(length=10):
chars = string.ascii_lowercase + string.digits
return ''.join(random.choices(chars, k=length))
room_name = generate_room_name()
jitsi_url = f"https://meet.jit.si/{room_name}"
print("Classroom link:", jitsi_url)
Этот код генерирует уникальное имя класса и выдаёт ссылку. Осталось только отправить её ученикам — хоть по email, хоть через чат-бота!
### Добавляем управление через API
А вот пример запроса к Jitsi Videobridge для получения статистики о комнатах (необходима авторизация):
import requests
server = "https://your-jitsi-server.com"
stats_url = f"{server}/colibri/stats"
response = requests.get(stats_url, auth=('user', 'password'))
print(response.json())
Используя такие запросы, можно отслеживать загруженность сервера: если классов стало слишком много — поднимаем ещё один инстанс.
### Встраиваем Jitsi в веб-приложение
Jitsi легко добавляется на сайт через iframe. Python-проекты на Flask или Django могут генерировать HTML-шаблон с вашей уникальной комнатой:
<iframe allow="camera; microphone; fullscreen; display-capture"
src="https://meet.jit.si/{{ room }}"
style="height: 500px; width: 100%;"></iframe>
Подставьте в
{{ room }}
имя, которое сгенерировал ваш Python-скрипт — и ваша собственная видеоклассная комната готова!Вывод:
С помощью пары строк Python и мощи Jitsi можно быстро настроить интерактивные уроки, не разбираясь в сложных API и видеостримах. Экспериментируйте, и пусть ваши виртуальные классы всегда будут полны энтузиазма!
❤2
Привет, друзья! На связи Иван — сегодня поговорим о магии управления состоянием пользователей в Python с помощью session-объектов.
### Сессии: что это вообще такое?
Когда пользователь взаимодействует с веб-приложением, серверу часто нужно "помнить", кто этот пользователь и что он делал минуту назад. Именно в этом случае на сцену выходят session-объекты: они позволяют сохранить состояние между запросами, создавая иллюзию постоянного соединения клиента с сервером.
### Flask и сессии
Один из самых простых способов работы с сессиями в Python — использовать микрофреймворк Flask. Здесь сессии реализованы очень удобно:
Здесь благодаря
### Requests и cookies
Если вам нужно управлять состоянием не на сервере, а в клиенте (например, писать бота для сайта), пригодится модуль
Сессия позволяет использовать одни и те же cookies для всех запросов, сразу открывая большие возможности для автоматизации.
### На что обратить внимание:
- Всегда храните секретные ключи вне кода!
- Сессии — не лучший способ хранить крупные объекты или большие объемы данных.
- Удалять данные из session можно с помощью
### Итоги
Сессии — это сердце любого сложного веб-приложения: без них ни аутентификацию, ни корзину покупок реализовать не получится. Используйте возможности Flask и requests на полную катушку, не забывая о безопасности. Удачного кодинга!
### Сессии: что это вообще такое?
Когда пользователь взаимодействует с веб-приложением, серверу часто нужно "помнить", кто этот пользователь и что он делал минуту назад. Именно в этом случае на сцену выходят session-объекты: они позволяют сохранить состояние между запросами, создавая иллюзию постоянного соединения клиента с сервером.
### Flask и сессии
Один из самых простых способов работы с сессиями в Python — использовать микрофреймворк Flask. Здесь сессии реализованы очень удобно:
from flask import Flask, session, redirect, url_for, request
app = Flask(__name__)
app.secret_key = 'super_secret_key' # Необходима для криптографии!
@app.route('/login', methods=['POST'])
def login():
user = request.form['username']
session['username'] = user
return redirect(url_for('profile'))
@app.route('/profile')
def profile():
if 'username' in session:
return f"Hello, {session['username']}!"
return 'You are not logged in.'
# Для запуска: app.run()
Здесь благодаря
session['username']
сохранится имя пользователя, и при следующем запросе сервер быстро узнает, кто к нему пришел.### Requests и cookies
Если вам нужно управлять состоянием не на сервере, а в клиенте (например, писать бота для сайта), пригодится модуль
requests
. В нем есть Session
-объект, который автоматически сохраняет cookies:import requests
s = requests.Session()
login_payload = {'user': 'bob', 'password': 'qwerty'}
s.post('https://example.com/login', data=login_payload)
resp = s.get('https://example.com/profile')
print(resp.text) # Профиль Bob'а, если логин успешен!
Сессия позволяет использовать одни и те же cookies для всех запросов, сразу открывая большие возможности для автоматизации.
### На что обратить внимание:
- Всегда храните секретные ключи вне кода!
- Сессии — не лучший способ хранить крупные объекты или большие объемы данных.
- Удалять данные из session можно с помощью
session.pop('key', None)
или session.clear()
.### Итоги
Сессии — это сердце любого сложного веб-приложения: без них ни аутентификацию, ни корзину покупок реализовать не получится. Используйте возможности Flask и requests на полную катушку, не забывая о безопасности. Удачного кодинга!
👍2
Привет, с вами Иван! Сегодня разберём интересную тему — как написать свой собственный лексический анализатор (lexer) на Python, используя модуль re. Это умение полезно, если вы хотите понять, как работают языки программирования изнутри или написать парсер для небольшого языка.
## Немного теории
Лексический анализатор — это инструмент, который разбивает текст на “токены”: числа, идентификаторы, слова, спецсимволы и т.д. Например, строку
Модуль re (regular expressions) делает этот процесс максимально простым и лаконичным.
## Делаем свой мини-лексер
Рассмотрим пример — напишем лексер для простых арифметических выражений (числа, знаки операций, скобки):
Давайте проверим на практике:
Результат:
## Как это работает?
- Для каждого токена задаём регулярное выражение.
- re.finditer проходит по всей строке, находя совпадения с шаблонами.
- Если токен — пробел или таб, пропускаем его. Если неизвестный символ — бросаем ошибку.
С помощью такой конструкции вы легко можете добавить новые типы токенов или немного сложнее изменить правила языка.
## Заключение
Создавать лексеры на Python просто — достаточно комбинировать немного re и креативности. Это отличный эксперимент для углубления знаний о языках и внутренних механизмах их работы!
На связи, Иван.
## Немного теории
Лексический анализатор — это инструмент, который разбивает текст на “токены”: числа, идентификаторы, слова, спецсимволы и т.д. Например, строку
x = 5 + y
лексер превращает в список токенов: имя, знак равно, число, плюс, имя.Модуль re (regular expressions) делает этот процесс максимально простым и лаконичным.
## Делаем свой мини-лексер
Рассмотрим пример — напишем лексер для простых арифметических выражений (числа, знаки операций, скобки):
import re
# Описываем типы токенов и шаблоны для них
token_spec = [
("NUMBER", r'\d+(\.\d*)?'), # целое или дробное число
("IDENT", r'[A-Za-z_]\w*'), # идентификатор
("PLUS", r'\+'), # плюс
("MINUS", r'-'), # минус
("MULT", r'\*'), # умножение
("DIV", r'/'), # деление
("LPAREN", r'\('), # левая скобка
("RPAREN", r'\)'), # правая скобка
("SKIP", r'[ \t]+'), # пропускаем пробелы и табы
("MISMATCH", r'.'), # неизвестный символ — ошибка
]
token_regex = '|'.join(f'(?P<{name}>{pattern})' for name, pattern in token_spec)
def tokenize(code):
for match in re.finditer(token_regex, code):
kind = match.lastgroup
value = match.group()
if kind == "SKIP":
continue
elif kind == "MISMATCH":
raise RuntimeError(f"Unexpected character: {value}")
yield (kind, value)
Давайте проверим на практике:
expr = "a1 = 3.5 + (b2 - 7) * 4"
tokens = list(tokenize(expr))
print(tokens)
Результат:
[('IDENT', 'a1'), ('MISMATCH', '='), ('NUMBER', '3.5'), ('PLUS', '+'),
('LPAREN', '('), ('IDENT', 'b2'), ('MINUS', '-'), ('NUMBER', '7'),
('RPAREN', ')'), ('MULT', '*'), ('NUMBER', '4')]
## Как это работает?
- Для каждого токена задаём регулярное выражение.
- re.finditer проходит по всей строке, находя совпадения с шаблонами.
- Если токен — пробел или таб, пропускаем его. Если неизвестный символ — бросаем ошибку.
С помощью такой конструкции вы легко можете добавить новые типы токенов или немного сложнее изменить правила языка.
## Заключение
Создавать лексеры на Python просто — достаточно комбинировать немного re и креативности. Это отличный эксперимент для углубления знаний о языках и внутренних механизмах их работы!
На связи, Иван.
Привет! Меня зовут Иван, и сегодня мы поговорим о настоящей магии асинхронных задач в Python — модуле Celery. Представьте, что ваш сайт отправляет письма пользователям или обрабатывает тяжелые отчёты. Если выполнять это прямо в запросе пользователя — он уснёт, дожидаясь ответа. А вот если передать дело “отложенному работнику” — всё становится куда быстрее. Именно таким работником и выступает Celery.
## Кратко: что такое Celery?
Celery — это распределённый исполнитель задач, написанный на Python. Он позволяет запускать любые функции в фоне, не блокируя основной поток программы. Для работы ему потребуется брокер сообщений, например, Redis или RabbitMQ — через них Celery отправляет задачи своим воркерам.
## Первый пример — отправка письма
Давайте рассмотрим простой пример. Сначала установим необходимые пакеты:
Создадим файл
Теперь можно вызвать задачу асинхронно:
Функция
## Второй пример — продолжительный процессинг
Что делать, если вам надо обработать много данных, например, генерировать PDF-отчёты? Запускаем это тоже через Celery!
Теперь задача “варится” в фоне, не мешая пользователям сайта.
## Почему Celery популярен?
- Гибкость: задачи могут быть очередями с разными приоритетами.
- Масштабируемость: запускайте хоть сотню воркеров — всё заработает.
- Мониторинг: Celery легко интегрируется с Flower — инструментом визуального контроля за задачами.
Celery — идеальный выбор, если быстрые фокусы уже не спасают, а задачи требуются “класть на потом”. Попробуйте применить его в своих проектах — и код задышит полной грудью!
## Кратко: что такое Celery?
Celery — это распределённый исполнитель задач, написанный на Python. Он позволяет запускать любые функции в фоне, не блокируя основной поток программы. Для работы ему потребуется брокер сообщений, например, Redis или RabbitMQ — через них Celery отправляет задачи своим воркерам.
## Первый пример — отправка письма
Давайте рассмотрим простой пример. Сначала установим необходимые пакеты:
pip install celery redis
Создадим файл
tasks.py
:from celery import Celery
app = Celery('my_tasks', broker='redis://localhost:6379/0')
@app.task
def send_welcome_email(user_email):
print(f"Sending welcome email to {user_email}")
# тут могла бы быть интеграция с реальной email-системой
Теперь можно вызвать задачу асинхронно:
# main.py
from tasks import send_welcome_email
send_welcome_email.delay('newuser@example.com')
Функция
delay
— и есть магия: она “отправляет” задачу воркеру Celery, а не запускает её прямо сейчас.## Второй пример — продолжительный процессинг
Что делать, если вам надо обработать много данных, например, генерировать PDF-отчёты? Запускаем это тоже через Celery!
@app.task
def generate_report(report_id):
print(f"Generating report {report_id}...")
# Симуляция долгой работы
import time
time.sleep(5)
print(f"Report {report_id} is ready!")
Теперь задача “варится” в фоне, не мешая пользователям сайта.
## Почему Celery популярен?
- Гибкость: задачи могут быть очередями с разными приоритетами.
- Масштабируемость: запускайте хоть сотню воркеров — всё заработает.
- Мониторинг: Celery легко интегрируется с Flower — инструментом визуального контроля за задачами.
Celery — идеальный выбор, если быстрые фокусы уже не спасают, а задачи требуются “класть на потом”. Попробуйте применить его в своих проектах — и код задышит полной грудью!
👍1
Привет! С вами Иван, и сегодня мы окунемся в магию живых, мгновенных соединений с помощью WebSocket и Python.
Когда слышишь слово “бот”, сразу представляешь автоматизацию рутины: рассылки, ответы, акции. Но большинство таких ботов работает с HTTP-запросами — обычными односторонними сообщениями. А что если нужен живой диалог, например, чат-бот или отслеживание биржевых цен в режиме реального времени? Вот тут и появляется герой сегодняшнего выпуска — протокол WebSocket!
WebSocket — это двустороннее соединение: клиент и сервер могут отправлять данные друг другу как только захотят. И Python готов работать с этим напрямую через библиотеку
### Первый пример: клиент на WebSocket
Допустим, у нас есть сервер, который шлет случайное число раз в секунду. Вот как подключиться к нему:
Всего несколько строк — и вы уже получаете данные в реальном времени!
### Второй пример: сервер WebSocket на Python
Запустить свой сервер тоже просто:
Этот сервер будет каждую секунду отдавать случайное число всем подключившимся.
### Идеи для ботов
С помощью WebSocket вы можете сделать:
- чат-бота, который отвечает мгновенно, реагируя на каждое сообщение;
- сборщика уведомлений из разных систем в одном месте;
- монитор трейдов и бирж, чтобы получать апдейты моментально.
Используйте WebSocket для ускорения реакции в своих Python-проектах — этот протокол буквально открывает двери в мир мгновенного обмена данными.
Когда слышишь слово “бот”, сразу представляешь автоматизацию рутины: рассылки, ответы, акции. Но большинство таких ботов работает с HTTP-запросами — обычными односторонними сообщениями. А что если нужен живой диалог, например, чат-бот или отслеживание биржевых цен в режиме реального времени? Вот тут и появляется герой сегодняшнего выпуска — протокол WebSocket!
WebSocket — это двустороннее соединение: клиент и сервер могут отправлять данные друг другу как только захотят. И Python готов работать с этим напрямую через библиотеку
websockets
.### Первый пример: клиент на WebSocket
Допустим, у нас есть сервер, который шлет случайное число раз в секунду. Вот как подключиться к нему:
import asyncio
import websockets
async def listen():
uri = "ws://localhost:8765"
async with websockets.connect(uri) as websocket:
while True:
message = await websocket.recv()
print(f"Received: {message}")
asyncio.run(listen())
Всего несколько строк — и вы уже получаете данные в реальном времени!
### Второй пример: сервер WebSocket на Python
Запустить свой сервер тоже просто:
import asyncio
import random
import websockets
async def send_random(websocket):
while True:
number = random.randint(1, 100)
await websocket.send(str(number))
await asyncio.sleep(1)
async def main():
async with websockets.serve(send_random, "localhost", 8765):
await asyncio.Future() # run forever
asyncio.run(main())
Этот сервер будет каждую секунду отдавать случайное число всем подключившимся.
### Идеи для ботов
С помощью WebSocket вы можете сделать:
- чат-бота, который отвечает мгновенно, реагируя на каждое сообщение;
- сборщика уведомлений из разных систем в одном месте;
- монитор трейдов и бирж, чтобы получать апдейты моментально.
Используйте WebSocket для ускорения реакции в своих Python-проектах — этот протокол буквально открывает двери в мир мгновенного обмена данными.
👍1
Привет, на связи Иван! Сегодня расскажу о двух хитрых помощниках Python — модулях shutil и os, которые превращают скучную работу с файлами и папками в настоящее шоу. Узнаем, как быстро манипулировать файлами, автоматизировать рутину и не бояться "переезда" данных.
### Модуль os: база для маневров
Модуль os — это как швейцарский нож для работы с файловой системой. С его помощью можно узнать, какие файлы лежат в папке, создать каталоги и даже выяснить, в какой именно папке сейчас "живет" скрипт.
Секрет №1: всегда проверяйте существование файлов и папок перед операциями! Это спасёт от ненужных ошибок.
### Модуль shutil: мастер “телепортации” данных
Когда нужно не просто узнать, а двигать файлы или целые каталоги, приходит время shutil. Этот модуль умеет копировать, переносить и удалять данные, и делает это красиво и безопасно.
Секрет №2: Используйте
### Combo: автоматизация на максимум
Комбинируя os и shutil, можно создать свои файловые менеджеры или скрипты для бэкапа. Например, копировать все файлы с определённым расширением:
### Итог
shutil и os — тандем для любой работы с файлами и папками. Запомните ключевые методы, всегда проверяйте операции на существование объектов и пробуйте писать автоматизации под себя! Всегда рад делиться секретами продуктивной работы на Python — до новых встреч, ваш Иван.
### Модуль os: база для маневров
Модуль os — это как швейцарский нож для работы с файловой системой. С его помощью можно узнать, какие файлы лежат в папке, создать каталоги и даже выяснить, в какой именно папке сейчас "живет" скрипт.
import os
current_dir = os.getcwd() # Текущая рабочая директория
files = os.listdir(current_dir) # Список файлов в папке
os.mkdir('new_folder') # Создаём новую папку
os.rename('file.txt', 'renamed_file.txt') # Переименование файла
Секрет №1: всегда проверяйте существование файлов и папок перед операциями! Это спасёт от ненужных ошибок.
if not os.path.exists('new_folder'):
os.mkdir('new_folder')
### Модуль shutil: мастер “телепортации” данных
Когда нужно не просто узнать, а двигать файлы или целые каталоги, приходит время shutil. Этот модуль умеет копировать, переносить и удалять данные, и делает это красиво и безопасно.
import shutil
shutil.copy('data.txt', 'backup/data.txt') # Копируем файл
shutil.move('backup/data.txt', 'archive/data.txt') # Перемещаем файл
shutil.rmtree('archive') # Удаляем целую папку cо всеми файлами!
Секрет №2: Используйте
shutil.copytree()
для копирования целых каталогов, а ещё — можно фильтровать, какие файлы копировать!def ignore_txt_files(dir, files):
return [f for f in files if f.endswith('.txt')]
shutil.copytree('original', 'copy', ignore=ignore_txt_files)
### Combo: автоматизация на максимум
Комбинируя os и shutil, можно создать свои файловые менеджеры или скрипты для бэкапа. Например, копировать все файлы с определённым расширением:
import os
import shutil
for filename in os.listdir('docs'):
if filename.endswith('.pdf'):
shutil.copy(os.path.join('docs', filename), 'pdf_backup')
### Итог
shutil и os — тандем для любой работы с файлами и папками. Запомните ключевые методы, всегда проверяйте операции на существование объектов и пробуйте писать автоматизации под себя! Всегда рад делиться секретами продуктивной работы на Python — до новых встреч, ваш Иван.
👍1
Привет! С вами Иван и сегодня поговорим о настоящей магии — модуле
## Что такое mmap и зачем он нужен?
## Пример 1: Чтение кусочка огромного файла
Допустим, у нас есть гигантский лог-файл, а мы хотим прочитать только первые 100 байт.
Здесь мы не загружаем весь файл в память, а просто работаем с окном нужного размера. Удобно и быстро!
## Пример 2: Поиск без загрузки файла
А если нужен поиск по файлу? Смотри, как просто ищется подстрока:
Как в строке, только по файлу, и всё ― без лишней траты памяти.
## Пример 3: Редактирование файла на месте
Изменения сразу отражаются в файле!
## Итог
— Иван, ваш проводник в мир эффективного Python
mmap
в Python. Все мы привыкли работать с файлами по-старинке: открыли, прочитали в память, закрыли. Но что если файл огромный, а нам нужно обработать только его часть? Пожалуй, тут на сцену выходит герой дня — mmap
.## Что такое mmap и зачем он нужен?
mmap
позволяет отображать файл в память и работать с ним как с обычным массивом байтов. Это особенно круто при работе с большими файлами, когда нет смысла тратить память на всё содержимое сразу. Всё, что тебе нужно — доступно по байтовому адресу!## Пример 1: Чтение кусочка огромного файла
Допустим, у нас есть гигантский лог-файл, а мы хотим прочитать только первые 100 байт.
import mmap
with open('huge.log', 'rb') as f:
with mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_READ) as mm:
snippet = mm[:100]
print(snippet.decode('utf-8', errors='ignore'))
Здесь мы не загружаем весь файл в память, а просто работаем с окном нужного размера. Удобно и быстро!
## Пример 2: Поиск без загрузки файла
А если нужен поиск по файлу? Смотри, как просто ищется подстрока:
import mmap
search_phrase = b'ERROR'
with open('huge.log', 'rb') as f:
with mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_READ) as mm:
pos = mm.find(search_phrase)
if pos != -1:
print(f'Found at position {pos}')
Как в строке, только по файлу, и всё ― без лишней траты памяти.
## Пример 3: Редактирование файла на месте
mmap
позволяет даже изменять файлы на лету. Например, заменить первые 5 байт на другие:import mmap
with open('data.bin', 'r+b') as f:
with mmap.mmap(f.fileno(), length=0) as mm:
mm[0:5] = b'HELLO'
Изменения сразу отражаются в файле!
## Итог
mmap
станет отличным подспорьем, если вы хотите ускорить работу с файлами, не жертвуя оперативной памятью. Работать с файлами становится действительно удобно ― вы просто манипулируете данными как с массивом, и всё прозрачно сохраняется на диск. Обязательно попробуйте в своих проектах!— Иван, ваш проводник в мир эффективного Python
👍1
Привет! На связи Иван, и сегодня разберём один из мощных инструментов для работы с XML и HTML — библиотеку lxml. Если вы когда-либо сталкивались с необходимостью "разобрать" XML-файл или вытянуть кусочек информации из HTML, lxml сделает это за считанные строки кода. Давайте посмотрим, как работает синтаксический анализ и построение деревьев с этим модулем на практике.
## Загрузка и структура XML
Для начала представим классический XML:
С помощью lxml превратить этот текст в дерево проще простого:
Теперь
Вывод будет:
## Парсинг HTML и XPath
Работает lxml и с HTML! Очень удобно, если нужно вытащить ссылки или заголовки со странички.
## Зачем всё это?
lxml крут тем, что строит дерево элементов: вы можете свободно перемещаться по структуре, менять значения, добавлять или удалять узлы. XPath — как навигация по дереву на стероидах: за одну строку можно вытянуть вообще всё, что душе угодно.
В результате: lxml незаменим, когда появляется задача парсить XML или HTML, вытаскивать данные, модифицировать структуру, или даже генерировать новые файлы. Всего три-четыре строки кода — и у вас весь документ, как на ладони.
## Загрузка и структура XML
Для начала представим классический XML:
<data>
<user id="1">
<name>John</name>
<age>30</age>
</user>
<user id="2">
<name>Ann</name>
<age>25</age>
</user>
</data>
С помощью lxml превратить этот текст в дерево проще простого:
from lxml import etree
xml_text = '''
<data>
<user id="1">
<name>John</name>
<age>30</age>
</user>
<user id="2">
<name>Ann</name>
<age>25</age>
</user>
</data>
'''
root = etree.fromstring(xml_text)
Теперь
root
— вершина дерева, а каждый "user" — его потомок. Посмотреть, кто есть кто:for user in root.findall("user"):
print(user.get("id"), user.findtext("name"))
Вывод будет:
1 John
2 Ann
## Парсинг HTML и XPath
Работает lxml и с HTML! Очень удобно, если нужно вытащить ссылки или заголовки со странички.
from lxml import html
html_text = '''
<html>
<body>
<h2>Cool title</h2>
<a href="https://example.com">Read more</a>
</body>
</html>
'''
tree = html.fromstring(html_text)
link = tree.xpath('//a/@href')[0]
title = tree.xpath('//h2/text()')[0]
print(title, link)
## Зачем всё это?
lxml крут тем, что строит дерево элементов: вы можете свободно перемещаться по структуре, менять значения, добавлять или удалять узлы. XPath — как навигация по дереву на стероидах: за одну строку можно вытянуть вообще всё, что душе угодно.
В результате: lxml незаменим, когда появляется задача парсить XML или HTML, вытаскивать данные, модифицировать структуру, или даже генерировать новые файлы. Всего три-четыре строки кода — и у вас весь документ, как на ладони.
Привет! С вами Иван, и сегодня хочу поговорить о том, как работать с конфиденциальными данными в Python и не дать утечкам информации сломать вам карьеру (или, не дай бог, жизнь).
Работая с конфиденциальной информацией — паролями, токенами, API-ключами, персональными данными — нельзя слепо полагаться на "авось пронесёт". Давайте пройдёмся по базовым, жизненно необходимым приемам защиты данных на практике.
1. Не храните секреты в коде
Каждый видел примеры вроде:
Это антипаттерн! Любой, у кого есть доступ к коду, увидит ваш пароль. Используйте переменные окружения:
Храните настоящие значения в файле
2. Используйте dotenv для удобства
Модуль
И загрузите их:
3. Никогда не логируйте чувствительные данные
Если вы ведёте логи, не заносите в них пароли, токены, номера карт. Используйте параметр mask в логах своего приложения или самостоятельно следите, что именно выводит ваш print/logging:
4. Шифруйте данные на диске и в передаче
Для простого симметричного шифрования идеально подходит модуль
Храните ключ отдельно от самого приложения!
5. Не забывайте про права доступа
Соблюдайте принцип наименьших привилегий — не давайте скриптам больше полномочий, чем нужно. И не храните лишние данные без необходимости.
Вывод:
Работа с конфиденциальной информацией – это не только про модные фреймворки, но и про вашу репутацию. Грамотно подходите к вопросам хранения и передачи секретов, а Python и пара библиотек вам в этом помогут.
Работая с конфиденциальной информацией — паролями, токенами, API-ключами, персональными данными — нельзя слепо полагаться на "авось пронесёт". Давайте пройдёмся по базовым, жизненно необходимым приемам защиты данных на практике.
1. Не храните секреты в коде
Каждый видел примеры вроде:
password = "SuperSecret123"
Это антипаттерн! Любой, у кого есть доступ к коду, увидит ваш пароль. Используйте переменные окружения:
import os
password = os.getenv("DB_PASSWORD")
Храните настоящие значения в файле
.env
и никогда не загружайте его в git-репозиторий.2. Используйте dotenv для удобства
Модуль
python-dotenv
поможет легко считывать переменные окружения из файла. Просто создайте .env
-файл:DB_PASSWORD=SuperSecret123
И загрузите их:
from dotenv import load_dotenv
import os
load_dotenv()
password = os.getenv("DB_PASSWORD")
3. Никогда не логируйте чувствительные данные
Если вы ведёте логи, не заносите в них пароли, токены, номера карт. Используйте параметр mask в логах своего приложения или самостоятельно следите, что именно выводит ваш print/logging:
import logging
logging.info("User logged in") # А вот такого - избегайте: logging.info(f"Password: {password}")
4. Шифруйте данные на диске и в передаче
Для простого симметричного шифрования идеально подходит модуль
cryptography
:from cryptography.fernet import Fernet
key = Fernet.generate_key()
f = Fernet(key)
token = f.encrypt(b"My secret data")
print(token)
print(f.decrypt(token))
Храните ключ отдельно от самого приложения!
5. Не забывайте про права доступа
Соблюдайте принцип наименьших привилегий — не давайте скриптам больше полномочий, чем нужно. И не храните лишние данные без необходимости.
Вывод:
Работа с конфиденциальной информацией – это не только про модные фреймворки, но и про вашу репутацию. Грамотно подходите к вопросам хранения и передачи секретов, а Python и пара библиотек вам в этом помогут.
👍1