Перейти к содержимому

Ввод и вывод данных. Форматирование. Работа с файлами [1.6 ]

Ввод и вывод данных. Форматирование. Работа с файлами [1.6 ]

Содержание

Введение

Взаимодействие программы с внешним миром — ключевая возможность любого языка программирования. В Python это реализуется через стандартный ввод-вывод (консоль), форматирование строк для представления данных и работу с файлами для хранения информации. В этом уроке мы изучим все эти аспекты, что позволит создавать интерактивные и функциональные программы.

↑ К оглавлению

Стандартный ввод и вывод

Функция print() для вывода данных

Функция print() — основной инструмент для вывода информации на экран. Она принимает неограниченное количество аргументов и выводит их через пробел:

print('Hello', 'world', '!')  
# Hello world ! 

Рассмотрим параметры функции print():

ПараметрНазначениеПримерРезультат
sep Разделитель между аргументами (по умолчанию пробел) print('a', 'b', 'c', sep='-') a-b-c
end Символ в конце вывода (по умолчанию перенос строки) print('Hello', end=' '); print('World') Hello World

Распаковка списков в print()

Для красивого вывода списков используется оператор распаковки *:

numbers = [1, 2, 3, 4, 5]
print(numbers)          # [1, 2, 3, 4, 5]
print(*numbers)         # 1 2 3 4 5
print(*numbers, sep=' - ')  # 1 - 2 - 3 - 4 - 5
print(*numbers, sep=',', end='...')
# 1,2,3,4,5...  

Функция input() для ввода данных

Функция input() позволяет получить данные от пользователя:

# Базовое использование
name = input('Введите ваше имя: ')
print(f'Привет, {name}!')

# Важно: input() всегда возвращает строку!
age_str = input('Введите ваш возраст: ')  # '25'
age = int(age_str)  # Преобразование в число
print(f'Через 10 лет вам будет {age + 10}') 

Важное замечание: функция input() всегда возвращает строку, даже если пользователь вводит число. Для работы с числами необходимо использовать явное преобразование типов (int(), float()).

↑ К оглавлению

Форматирование строк

Форматирование строк позволяет создавать динамические сообщения, вставляя переменные в текст. В Python есть три основных способа форматирования.

1. %-форматирование (старый стиль)

Использует специальные символы внутри строки и кортеж значений после знака %:

СпецификаторОписаниеПримерРезультат
%d, %i Целое число "%d лет" % 25 "25 лет"
%f Число с плавающей точкой "%.2f" % 3.14159 "3.14"
%s Строка "%s" % "Python" "Python"
%e Экспоненциальная запись "%.2e" % 12345 "1.23e+04"

2. Метод format() (новый стиль)

Использует фигурные скобки {} в строке и метод .format() для подстановки значений:

# Позиционное форматирование
print("Позиции: {0}, {1}, {2}".format('first', 'second', 'third'))
# Позиции: first, second, third

# Именованное форматирование
print("Габариты: {width}x{height}".format(width=1920, height=1080))
# Габариты: 1920x1080

# Форматирование чисел
price = 1499.99
print("Цена: {:.2f} руб.".format(price))  # Цена: 1499.99 руб.
print("Цена с выравниванием: {:>10.2f} руб.".format(price))
# Цена с выравниванием:    1499.99 руб. 

3. F-строки (современный стиль, Python 3.6+)

F-строки (formatted string literals) — самый современный и удобный способ форматирования:

name = "Михаил"
age = 30
salary = 150000.75

# Базовое использование
print(f'Имя: {name}, Возраст: {age}, Зарплата: {salary:,.2f} руб.')
# Имя: Михаил, Возраст: 30, Зарплата: 150,000.75 руб.

# Вычисления внутри f-строк
print(f'Через 5 лет {name} будет {age + 5} лет')
print(f'Ежемесячная зарплата: {salary / 12:.2f} руб.')

# Форматирование даты
from datetime import datetime
current_date = datetime.now()
print(f'Текущая дата: {current_date:%d.%m.%Y %H:%M}')
# Текущая дата: 26.12.2025 14:30

# Выравнивание и отступы
items = [('Яблоки', 10), ('Бананы', 15), ('Апельсины', 8)]
print(f'{"Товар":15} | {"Количество":>10}')
print('-' * 30)
for item, count in items:
    print(f'{item:15} | {count:>10}')
# Товар           |   Количество
# ------------------------------
# Яблоки          |         10
# Бананы          |         15  
# Апельсины       |          8

Рекомендация: Для нового кода предпочитайте f-строки — они наиболее читаемы и эффективны.

↑ К оглавлению

Работа с файлами

Работа с файлами позволяет сохранять данные между запусками программы и обрабатывать большие объемы информации.

Основные режимы открытия файлов

РежимОписаниеОсобенности
r Чтение (read) Файл должен существовать
w Запись (write) Создает новый файл или перезаписывает существующий
a Добавление (append) Добавляет данные в конец файла
r+ Чтение и запись Файл должен существовать
w+ Чтение и запись Создает файл или очищает существующий
a+ Чтение и добавление Создает файл при необходимости
b Бинарный режим Используется вместе с другими режимами (rb, wb)

Базовые операции с файлами

Открытие и закрытие файла (классический подход) 

# Открытие файла
file = open('example.txt', 'r', encoding='utf-8')

# Работа с файлом
content = file.read()
print(content)

# Закрытие файла (обязательно!)
file.close()

Важно: Всегда закрывайте файлы после использования! Незакрытые файлы могут привести к утечкам памяти и потере данных.

Менеджер контекста with (рекомендуемый подход) 

# Автоматическое закрытие файла
with open('example.txt', 'r', encoding='utf-8') as file:
    content = file.read()
    print(content)
# Файл автоматически закроется после выхода из блока

Преимущества менеджера контекста:

  • Автоматическое закрытие файла даже при возникновении исключений
  • Более чистый и лаконичный код
  • Гарантированное освобождение ресурсов

Методы чтения файлов 

with open('poem.txt', 'r', encoding='utf-8') as file:
    # Чтение всего файла
    entire_content = file.read()
    print('Весь файл:')
    print(entire_content)
    
    # Перемещение курсора в начало
    file.seek(0)
    
    # Чтение построчно
    print('\nЧтение построчно:')
    for line in file:
        print(line.strip())  # strip() удаляет пробелы и переносы строк
    
    # Перемещение курсора в начало
    file.seek(0)
    
    # Чтение в список строк
    lines = file.readlines()
    print(f'\nКоличество строк: {len(lines)}')
    print(f'Первая строка: {lines[0].strip()}')

Методы записи в файлы 

# Запись в файл
with open('output.txt', 'w', encoding='utf-8') as file:
    # Запись строки
    file.write('Первая строка\n')
    file.write('Вторая строка\n')
    
    # Запись списка строк
    data = ['Третья строка\n', 'Четвертая строка\n']
    file.writelines(data)

# Добавление в конец файла
with open('output.txt', 'a', encoding='utf-8') as file:
    file.write('Эта строка добавлена в конец\n')

# Использование print() для записи в файл
with open('log.txt', 'w', encoding='utf-8') as log_file:
    print('Запуск программы', file=log_file)
    print(f'Текущее время: {datetime.now()}', file=log_file)
    print('Данные для сохранения:', [1, 2, 3, 4, 5], file=log_file)
↑ К оглавлению

Практические примеры

Пример 1: Программа для ведения дневника

 

def add_diary_entry():
    """Добавляет новую запись в дневник"""
    entry = input('Введите вашу запись: ')
    
    with open('diary.txt', 'a', encoding='utf-8') as file:
        from datetime import datetime
        timestamp = datetime.now().strftime('%d.%m.%Y %H:%M')
        file.write(f'[{timestamp}] {entry}\n')
    
    print('Запись успешно добавлена!')

def view_diary_entries():
    """Показывает все записи из дневника"""
    try:
        with open('diary.txt', 'r', encoding='utf-8') as file:
            entries = file.read()
            if entries:
                print('Ваши записи:')
                print(entries)
            else:
                print('Дневник пуст')
    except FileNotFoundError:
        print('Дневник еще не создан')

# Основное меню программы
while True:
    print('\n=== МЕНЮ ДНЕВНИКА ===')
    print('1. Добавить запись')
    print('2. Просмотреть записи') 
    print('3. Выход')
    
    choice = input('Выберите действие: ')
    
    if choice == '1':
        add_diary_entry()
    elif choice == '2':
        view_diary_entries()
    elif choice == '3':
        print('До свидания!')
        break
    else:
        print('Неверный выбор. Попробуйте еще раз')

Пример 2: Форматированный отчет 

def generate_sales_report(sales_data):
    """Генерирует форматированный отчет о продажах"""
    print('=' * 65)
    print(f'{"ОТЧЕТ О ПРОДАЖАХ":^65}')
    print(f'{"за период: 01.01.2024 - 31.01.2024":^65}')
    print('=' * 65)
    
    # Заголовки таблицы
    print(f'| {"Товар":20} | {"Количество":^12} | {"Цена":^10} | {"Сумма":>12} |')
    print('-' * 65)
    
    # Данные таблицы
    total_amount = 0
    for item in sales_data:
        name = item['name']
        quantity = item['quantity']
        price = item['price']
        amount = quantity * price
        total_amount += amount
        
        print(f'| {name:20} | {quantity:^12} | {price:^10.2f} | {amount:>12,.2f} |')
    
    # Итоговая строка
    print('-' * 65)
    print(f'| {"ИТОГО":20} | {"":^12} | {"":^10} | {total_amount:>12,.2f} |')
    print('=' * 65)
    
    # Сохранение отчета в файл
    with open('sales_report.txt', 'w', encoding='utf-8') as file:
        file.write('\n'.join([
            '=' * 65,
            f'{"ОТЧЕТ О ПРОДАЖАХ":^65}',
            f'{"за период: 01.01.2024 - 31.01.2024":^65}',
            '=' * 65,
            f'| {"Товар":20} | {"Количество":^12} | {"Цена":^10} | {"Сумма":>12} |',
            '-' * 65
        ]))
        
        for item in sales_data:
            name = item['name']
            quantity = item['quantity']
            price = item['price']
            amount = quantity * price
            file.write(f'\n| {name:20} | {quantity:^12} | {price:^10.2f} | {amount:>12,.2f} |')
        
        file.write('\n' + '-' * 65)
        file.write(f'\n| {"ИТОГО":20} | {"":^12} | {"":^10} | {total_amount:>12,.2f} |')
        file.write('\n' + '=' * 65)

# Данные для отчета
sales_data = [
    {'name': 'Ноутбук', 'quantity': 15, 'price': 65000.00},
    {'name': 'Смартфон', 'quantity': 32, 'price': 35000.00},
    {'name': 'Наушники', 'quantity': 48, 'price': 5000.00},
    {'name': 'Монитор', 'quantity': 22, 'price': 25000.00}
]

# Генерация отчета
generate_sales_report(sales_data)
print('\nОтчет успешно сохранен в файл sales_report.txt')

Пример 3: Анализ лог-файла 

def analyze_log_file(filename):
    """Анализирует лог-файл и выводит статистику"""
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            lines = file.readlines()
            
            print(f'Всего строк в файле: {len(lines)}')
            
            # Подсчет ошибок и предупреждений
            error_count = 0
            warning_count = 0
            info_count = 0
            
            for line in lines:
                if 'ERROR' in line:
                    error_count += 1
                elif 'WARNING' in line:
                    warning_count += 1
                elif 'INFO' in line:
                    info_count += 1
            
            print(f'\nСтатистика:')
            print(f'Количество ошибок (ERROR): {error_count}')
            print(f'Количество предупреждений (WARNING): {warning_count}')
            print(f'Количество информационных сообщений (INFO): {info_count}')
            
            # Вывод последних 5 строк
            print('\nПоследние 5 строк:')
            for line in lines[-5:]:
                print(line.strip())
                
    except FileNotFoundError:
        print(f'Файл {filename} не найден')
    except Exception as e:
        print(f'Произошла ошибка: {e}')

# Анализ лог-файла
analyze_log_file('application.log')

# Пример создания тестового лог-файла
test_log = """[2024-01-25 10:15:23] INFO: Приложение запущено
[2024-01-25 10:15:45] INFO: Пользователь вошел в систему
[2024-01-25 10:16:12] WARNING: Низкий уровень памяти (20%)
[2024-01-25 10:17:30] ERROR: Не удалось подключиться к базе данных
[2024-01-25 10:18:15] INFO: Повторная попытка подключения
[2024-01-25 10:18:45] ERROR: Таймаут подключения
[2024-01-25 10:19:20] WARNING: Используется резервный сервер
[2024-01-25 10:20:05] INFO: Подключение установлено
[2024-01-25 10:21:30] INFO: Операция выполнена успешно"""

with open('application.log', 'w', encoding='utf-8') as file:
    file.write(test_log)
↑ К оглавлению

Рекомендации и лучшие практики

Для работы с файлами:

  • Всегда используйте менеджер контекста with для автоматического закрытия файлов
  • Указывайте кодировку при работе с текстовыми файлами: encoding='utf-8'
  • Проверяйте существование файла перед чтением с помощью os.path.exists()
  • Используйте относительные пути для файлов в проекте, абсолютные — только при необходимости
  • Обрабатывайте исключения при работе с файловой системой

Для форматирования строк:

  • Предпочитайте f-строки для нового кода — они наиболее читаемы и эффективны
  • Используйте форматирование чисел для улучшения читаемости: {value:,.2f} для денежных сумм
  • Избегайте конкатенации строк с помощью + в циклах — это неэффективно
  • Экранируйте специальные символы при необходимости: {{ и }} для вывода фигурных скобок
  • Используйте выравнивание для создания таблиц и отчетов: {value:10}, {value:>10}, {value:^10}

Для ввода-вывода данных:

  • Валидируйте пользовательский ввод перед преобразованием типов
  • Используйте понятные подсказки в функции input()
  • Обрабатывайте исключения при работе с пользовательским вводом
  • Используйте параметр flush=True в print() для немедленного вывода
  • Разделяйте логику и ввод/вывод для лучшей тестируемости кода
↑ К оглавлению

Чек-лист для самопроверки

Ввод и вывод данных

Задача
Я знаю, как использовать функцию print() с параметрами sep и end
Я могу распаковывать списки для красивого вывода с помощью *
Я понимаю, что input() всегда возвращает строку и знаю, как преобразовывать типы
Я могу обрабатывать ошибки при преобразовании пользовательского ввода

Форматирование строк

Задача
Я знаю три способа форматирования строк: %-форматирование, format() и f-строки
Я могу форматировать числа с нужным количеством знаков после запятой
Я умею использовать выравнивание в форматировании строк
Я понимаю преимущества f-строк и могу их использовать для сложного форматирования
Я знаю, как форматировать даты и большие числа

Работа с файлами

Задача
Я знаю основные режимы открытия файлов и их назначение
Я использую менеджер контекста with для автоматического закрытия файлов
Я могу читать файл разными способами: полностью, построчно, в список строк
Я умею записывать данные в файл с помощью write() и writelines()
Я могу использовать print() для записи данных в файл
Я указываю кодировку при работе с текстовыми файлами
Я обрабатываю исключения при работе с файловой системой

Практические навыки

Задача
Я могу создать программу для работы с текстовыми файлами (дневник, логи, отчеты)
Я умею генерировать форматированные отчеты с таблицами и итогами
Я могу анализировать содержимое файлов и извлекать из них нужную информацию
Я понимаю, как сохранять данные программы между запусками
Я следую лучшим практикам при работе с вводом-выводом и файлами
↑ К оглавлению

Заключение

В этом уроке мы изучили ключевые аспекты взаимодействия Python-программ с внешним миром. Вы научились:

  • Использовать функции print() и input() для консольного ввода-вывода
  • Форматировать строки тремя различными способами для создания динамических сообщений
  • Работать с файлами: открывать, читать, записывать и закрывать их
  • Использовать менеджер контекста with для безопасной работы с файлами
  • Создавать практические приложения: дневники, отчеты, анализ логов

Эти навыки являются фундаментальными для любого Python-разработчика и позволят вам создавать реальные, полезные программы, способные сохранять данные и взаимодействовать с пользователем. В следующих уроках мы углубимся в изучение функций, классов и более сложных структур данных.

↑ К оглавлению

Примечания и важные моменты

Как организована структура HTML?

  • Документ начинается с обязательного объявления <!DOCTYPE html>
  • Основная структура: <html>, <head>, <body>
  • В <head> указана кодировка UTF-8 и заголовок страницы
  • Основное содержание размещено внутри тега <main>
  • Контент разбит на смысловые секции с помощью тегов <section>
  • Для навигации используются якорные ссылки с идентификаторами

Какие CSS-классы используются для оформления?

  • uk-accordion — для создания аккордеона
  • uk-accordion-title и uk-accordion-content — элементы аккордеона
  • uk-table, uk-table-divider — для стилизации таблиц
  • uk-button, uk-button-text — для кнопок и текстовых ссылок
  • uk-list — для стилизации списков внутри аккордеона

Какие скрипты подключены для взаимодействия с элементами?

  • UIkit JavaScript — для работы аккордеона и других интерактивных компонентов
  • Атрибут uk-accordion активирует компонент аккордеона
  • JavaScript-код для работы чекбоксов не требуется — используется нативный HTML

Ссылки по теме

Конспект:
Понедельник, 01 декабря 2025
Ввод и вывод данных. Форматирование. Работа с файлами [1.6 ]