веб страница с фото и фразами под ними

нам надо сделать веб страницу html
из набора случайных фото и фраз к каждому фото
фото jpg находятся в папке фото, а фразы в файле фраз.txt
программа в этой же папке где папка фото и файл фраз.txt
*
на питоне



Разберу задачу пошагово и предоставлю готовое решение на Python.

Шаг 1. Подготовка структуры папок и файлов
Убедитесь, что у вас есть:

папка фото/ с JPG;изображениями (например, фото/1.jpg, фото/2.jpg и т.;д.);

файл фраз.txt с фразами — по одной фразе на строку;

скрипт Python будет запускаться из той же директории, где находятся папка фото и файл фраз.txt.

Шаг 2. Код на Python


import os
import random

def create_html_gallery():
    # Пути к ресурсам
    photo_folder = 'фото'
    phrases_file = 'фраз.txt'
    output_html = 'gallery.html'

    # Получаем список всех JPG;файлов в папке фото
    if not os.path.exists(photo_folder):
        print(f"Ошибка: папка '{photo_folder}' не найдена!")
        return

    photo_files = [
        f for f in os.listdir(photo_folder)
        if f.lower().endswith(('.jpg', '.jpeg'))
    ]

    if not photo_files:
        print("В папке 'фото' нет JPG;файлов!")
        return

    # Читаем фразы из файла
    if not os.path.exists(phrases_file):
        print(f"Ошибка: файл '{phrases_file}' не найден!")
        return

    with open(phrases_file, 'r', encoding='utf-8') as f:
        phrases = [line.strip() for line in f if line.strip()]

    if not phrazes:
        print("Файл 'фраз.txt' пуст!")
        return

    # Если фраз меньше, чем фото, дублируем фразы
    while len(phrases) < len(photo_files):
        phrases.extend(phrases)

    # Перемешиваем фото и берём столько фраз, сколько фото
    random.shuffle(photo_files)
    selected_phrases = phrases[:len(photo_files)]

    # Генерируем HTML
    html_content = '''
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Галерея фото с фразами</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
            background-color: #f5f5f5;
        }
        .gallery {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
            gap: 20px;
            padding: 20px;
        }
        .photo-item {
            background: white;
            border-radius: 8px;
            padding: 15px;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
            text-align: center;
        }
        .photo-item img {
            max-width: 100%;
            height: auto;
            border-radius: 4px;
        }
        .phrase {
            margin-top: 10px;
            font-style: italic;
            color: #555;
        }
    </style>
</head>
<body>
    <h1>Галерея случайных фото с фразами</h1>
    <div class="gallery">
'''

    for photo, phrase in zip(photo_files, selected_phrases):
        photo_path = os.path.join(photo_folder, photo)
        html_content += f'''
        <div class="photo-item">
            <img src="{photo_path}" alt="Фото">
            <div class="phrase">{phrase}</div>
        </div>
'''

    html_content += '''
    </div>
</body>
</html>
'''

    # Сохраняем HTML;файл
    with open(output_html, 'w', encoding='utf-8') as f:
        f.write(html_content)

    print(f"HTML;страница успешно создана: {output_html}")
    print(f"Обработано фото: {len(photo_files)}")
    print(f"Использовано фраз: {len(selected_phrases)}")

# Запуск функции
if __name__ == "__main__":
    create_html_gallery()
Шаг 3. Как использовать
Сохраните код в файл create_gallery.py в той же папке, где лежат фото/ и фраз.txt.

Заполните фраз.txt фразами (по одной на строку). Пример содержимого:

Прекрасное утро!
Закат над горами
Счастливые моменты
Жизнь прекрасна
Улыбнись!
Поместите JPG;изображения в папку фото/.

Запустите скрипт:

bash
python create_gallery.py
После выполнения в той же папке появится файл gallery.html. Откройте его в браузере — вы увидите галерею с фото и подписями.

Пояснения к коду
Проверка существования папок и файлов — скрипт проверяет, что папка фото и файл фраз.txt существуют.

Чтение JPG;файлов — ищет все файлы с расширениями .jpg и .jpeg (регистронезависимо).

Чтение фраз — читает строки из фраз.txt, убирает пустые строки и лишние пробелы.

Сопоставление фото и фраз — если фраз меньше, чем фото, список фраз дублируется; фото перемешиваются случайным образом.

Генерация HTML — формируется сетка (grid) с блоками, каждый содержит изображение и фразу.

Стилевое оформление — встроенная CSS;стилизация для адаптивного отображения и приятного вида.

Хотите, я уточню какой;то блок подробнее или помогу адаптировать код под дополнительные требования?

Я
нужно уточнить число фото и фраз
Алиса
Вот доработанный код с подробной информацией о количестве фото и фраз — он выводит статистику до и после сопоставления:

python
import os
import random

def create_html_gallery():
    # Пути к ресурсам
    photo_folder = 'фото'
    phrases_file = 'фраз.txt'
    output_html = 'gallery.html'

    print("=== АНАЛИЗ ДАННЫХ ===")

    # Получаем список всех JPG;файлов в папке фото
    if not os.path.exists(photo_folder):
        print(f"Ошибка: папка '{photo_folder}' не найдена!")
        return

    photo_files = [
        f for f in os.listdir(photo_folder)
        if f.lower().endswith(('.jpg', '.jpeg'))
    ]

    total_photos = len(photo_files)
    print(f"Найдено фото в папке '{photo_folder}': {total_photos}")

    if not photo_files:
        print("В папке 'фото' нет JPG;файлов!")
        return

    # Читаем фразы из файла
    if not os.path.exists(phrases_file):
        print(f"Ошибка: файл '{phrases_file}' не найден!")
        return

    with open(phrases_file, 'r', encoding='utf-8') as f:
        phrases = [line.strip() for line in f if line.strip()]

    total_phrases = len(phrases)
    print(f"Найдено фраз в файле '{phrases_file}': {total_phrases}")

    if not phrazes:
        print("Файл 'фраз.txt' пуст!")
        return

    # Анализ соотношения фото и фраз
    print("\n=== АНАЛИЗ СООТНОШЕНИЯ ===")
    if total_phrases >= total_photos:
        print("Фраз достаточно для всех фото")
        need_duplication = False
    else:
        print("Фраз меньше, чем фото — потребуется дублирование фраз")
        need_duplication = True

    # Дублируем фразы, если их недостаточно
    original_phrases_count = total_phrases
    while len(phrases) < len(photo_files):
        phrases.extend(phrases[:total_photos - len(phrases)])

    selected_phrases = phrases[:len(photo_files)]
    final_phrases_count = len(selected_phrases)

    # Перемешиваем фото
    random.shuffle(photo_files)

    print(f"\n=== ИТОГОВАЯ СТАТИСТИКА ===")
    print(f"Всего фото для отображения: {total_photos}")
    print(f"Изначально фраз: {original_phrases_count}")
    print(f"Фраз после дублирования: {final_phrases_count}")
    if need_duplication:
        print(f"Некоторые фразы будут использованы повторно")
    else:
        print(f"Все фразы уникальны")

    # Генерируем HTML
    html_content = '''
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Галерея фото с фразами</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
            background-color: #f5f5f5;
        }
        .gallery {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
            gap: 20px;
            padding: 20px;
        }
        .photo-item {
            background: white;
            border-radius: 8px;
            padding: 15px;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
            text-align: center;
        }
        .photo-item img {
            max-width: 100%;
            height: auto;
            border-radius: 4px;
        }
        .phrase {
            margin-top: 10px;
            font-style: italic;
            color: #555;
        }
        .stats {
            background: #e9f7e9;
            padding: 15px;
            border-radius: 5px;
            margin: 20px 0;
            border-left: 4px solid #4CAF50;
        }
    </style>
</head>
<body>
    <h1>Галерея случайных фото с фразами</h1>

    <div class="stats">
        <h3>Статистика генерации:</h3>
        <p>Всего обработано фото: <strong>{total_photos}</strong></p>
        <p>Использовано фраз:         <p>Изначально доступно фраз:         {duplication_warning}
    </div>

    <div class="gallery">
'''.format(
        total_photos=total_photos,
        final_phrases_count=final_phrases_count,
        original_phrases_count=original_phrases_count,
        duplication_warning=(
            '<p style="color: #ff9800;"><strong>Внимание:</strong> Фразы были продублированы, так как их было недостаточно</p>'
            if need_duplication else
            '<p>Все фразы уникальны</p>'
        )
    )

    for photo, phrase in zip(photo_files, selected_phrases):
        photo_path = os.path.join(photo_folder, photo)
        html_content += f'''
        <div class="photo-item">
            <img src="{photo_path}" alt="Фото">
            <div class="phrase">{phrase}</div>
        </div>
'''

    html_content += '''
    </div>
</body>
</html>
'''

    # Сохраняем HTML;файл
    with open(output_html, 'w', encoding='utf-8') as f:
        f.write(html_content)

    print(f"\n=== РЕЗУЛЬТАТ ===")
    print(f"HTML;страница успешно создана: {output_html}")

# Запуск функции
if __name__ == "__main__":
    create_html_gallery()
Что изменилось и что показывает статистика
Программа теперь выводит подробную информацию на трёх этапах:

1. Анализ данных:

сколько всего фото найдено в папке фото/;

сколько всего фраз найдено в файле фраз.txt.

2. Анализ соотношения:

определяет, достаточно ли фраз для всех фото;

если фраз меньше — сообщает о необходимости дублирования.

3. Итоговая статистика:

общее количество фото для отображения;

изначальное количество фраз;

количество фраз после дублирования (если требовалось);

информация о повторном использовании фраз.

В HTML;файле также отображается блок статистики с:

общим количеством обработанных фото;

количеством использованных фраз;

изначальным количеством фраз;

предупреждением, если фразы дублировались.

Пример вывода в консоли
При запуске вы увидите примерно такое:

=== АНАЛИЗ ДАННЫХ ===
Найдено фото в папке 'фото': 15
Найдено фраз в файле 'фраз.txt': 8

=== АНАЛИЗ СООТНОШЕНИЯ ===
Фраз меньше, чем фото — потребуется дублирование фраз

=== ИТОГОВАЯ СТАТИСТИКА ===
Всего фото для отображения: 15
Изначально фраз: 8
Фраз после дублирования: 15
Некоторые фразы будут использованы повторно

=== РЕЗУЛЬТАТ ===
HTML;страница успешно создана: gallery.html
Хотите, я уточню какой;то блок кода подробнее или помогу адаптировать решение под дополнительные требования?


Рецензии