Ввод и вывод данных. Форматирование. Работа с файлами [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
![Ввод и вывод данных. Форматирование. Работа с файлами [1.6 ] Ввод и вывод данных. Форматирование. Работа с файлами [1.6 ]](https://technobee.ru/media/zoo/images/line100_python_24f065d5f44b128d7987e916e0a668ad.png)