Работа с вводом и выводом в Python (консольный и файловый)
Основы ввода и вывода в Python
Наиболее эффективное решение для типовой задачи: чтение чисел из файла, их суммирование и запись результата в другой файл.
Для работы с файлами рекомендуется использовать менеджер контекста with, который гарантирует корректное закрытие файла даже при возникновении ошибок. Основная идея: открыть файл для чтения, обработать каждую строку (преобразовать в нужный тип данных), накопить результат и записать его.
with open('input.txt', 'r', encoding='utf-8') as f_in:
numbers = []
for line in f_in:
line = line.strip() # удаляем пробелы и переносы
if line: # пропускаем пустые строки
try:
num = int(line)
numbers.append(num)
except ValueError:
print(f'Не удалось преобразовать строку: {line}')
total = sum(numbers)
with open('output.txt', 'w', encoding='utf-8') as f_out:
f_out.write(str(total))
ввод программ на python (ввод данных в программе python)
Пояснение шагов:
- Файл
input.txtоткрывается в режиме чтения ('r') с указанием кодировкиutf-8. - Цикл
for line in f_inпроходит по всем строкам файла. - Метод
strip()убирает лишние пробелы и символы новой строки. - Проверка
if lineисключает пустые строки. - Блок
try...exceptобрабатывает ошибки преобразования строки в целое число. - Сумма вычисляется функцией
sum(). - Результат записывается в
output.txtв режиме записи ('w').
Типичные ошибки и их решение:
- Ошибка FileNotFoundError – файл не найден. Решение: проверить путь к файлу или использовать блок
try...except. - ValueError при преобразовании – строка содержит нечисловые символы. Решение: добавить обработку исключений или предварительно фильтровать строки.
- Проблема с кодировкой – файл в другой кодировке (например, cp1251). Решение: указать правильную кодировку при открытии.
- Лишние пробелы и пустые строки – приводят к ошибкам или пустым значениям. Решение: всегда использовать
strip()и проверять на пустоту.
Как получить данные от пользователя и вывести результат?
Стандартный ввод с клавиатуры осуществляется функцией input(), вывод – функцией print(). Для числовых данных требуется преобразование типа.
name = input('Введите имя: ')
age = int(input('Введите возраст: '))
print(f'Привет, {name}! Тебе {age} лет.')
Python file io (ввод-вывод файлов в python)
Важно: input() всегда возвращает строку. Поэтому для математических операций нужно преобразовывать её в int() или float().
Проблема: пользователь вводит некорректные данные (буквы вместо числа).
Решение: обернуть преобразование в try...except и запрашивать повторный ввод.
Как прочитать весь файл целиком одной строкой?
Метод read() читает всё содержимое файла в одну строку. Удобно для небольших файлов.
with open('data.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
Python temp files (временные файлы в python)
При таком чтении важно помнить, что в конце строк могут быть символы переноса. Для обработки каждой строки по отдельности лучше использовать readlines() или цикл.
Проблема: очень большой файл может не поместиться в оперативной памяти.
Решение: использовать построчное чтение через цикл for line in f.
Как обрабатывать файлы большого размера построчно?
Построчное чтение не загружает весь файл в память. Подходит для логов, больших CSV и текстов.
with open('large.log', 'r', encoding='utf-8') as f:
for line_num, line in enumerate(f, 1):
if 'ERROR' in line:
print(f'Строка {line_num}: {line.strip()}')
Python index files (индексация файлов в python)
Функция enumerate добавляет номер строки для удобства.
Проблема: строки могут быть очень длинными, что замедляет обработку.
Решение: ограничить длину считываемой строки с помощью параметра size у метода readline().
Как записать список чисел в файл, каждое с новой строки?
Используется цикл или метод join() с генерацией строк.
numbers = [10, 20, 30, 40, 50]
with open('numbers.txt', 'w', encoding='utf-8') as f:
f.write('\n'.join(map(str, numbers)))
map(str, numbers) преобразует каждое число в строку, затем '\n'.join() объединяет их с переносом строки.
Проблема: если список содержит нестроковые элементы, возникнет ошибка TypeError.
Решение: всегда явно преобразовывать элементы в строки.
Расширенные примеры работы с вводом и выводом
Чтение CSV файла без использования модуля csv
Простой способ разобрать строки с разделителями-запятыми, если данные простые.
with open('data.csv', 'r', encoding='utf-8') as f:
for line in f:
parts = line.strip().split(',')
# предположим, что первые два поля – числа
if len(parts) >= 2:
try:
a, b = int(parts[0]), int(parts[1])
print(f'Сумма {a} и {b} равна {a + b}')
except ValueError:
print(f'Ошибка в строке: {line.strip()}')
Сумма 10 и 20 равна 30 Сумма 15 и 25 равна 40 Ошибка в строке: abc,def
Чтение файла с разными разделителями (пробелы, точки с запятой)
Можно использовать регулярные выражения или несколько вариантов разделителей через split().
import re
with open('mixed.txt', 'r', encoding='utf-8') as f:
for line in f:
# разделители: запятая, точка с запятой, пробел
parts = re.split(r'[;,\s]+', line.strip())
print(parts)
['10', '20', '30'] ['a', 'b', 'c']
Чтение бинарных файлов (изображения, байтовые данные)
Режим 'rb' (read binary) для чтения байтов, 'wb' для записи.
with open('image.jpg', 'rb') as f:
byte_data = f.read(100) # первые 100 байт
print(f'Первые 10 байт: {byte_data[:10]}')
Первые 10 байт: b'\xff\xd8\xff\xe0\x00\x10JFIF'
Использование генератора для чтения больших файлов с фильтрацией
Экономит память, обрабатывая строки по мере поступления.
def read_filtered(filename, keyword):
with open(filename, 'r', encoding='utf-8') as f:
for line in f:
if keyword in line:
yield line.strip()
for filtered_line in read_filtered('large.log', 'WARNING'):
print(filtered_line)
[23-05-2024] WARNING – low disk space [23-05-2024] WARNING – high memory usage
Запись временных файлов с автоматическим удалением
Модуль tempfile создаёт временные файлы, которые удаляются после закрытия.
import tempfile
with tempfile.NamedTemporaryFile(mode='w', delete=True, suffix='.txt', encoding='utf-8') as tmp:
tmp.write('Временные данные')
tmp.flush()
# можно прочитать этот файл по имени tmp.name
print(f'Файл создан: {tmp.name}')
# файл автоматически удалён
Файл создан: /tmp/tmpabc123.txt
Работа с разными кодировками: перекодировка файла из cp1251 в utf-8
Чтение в одной кодировке, запись в другой.
with open('source_cp1251.txt', 'r', encoding='cp1251') as f_in:
text = f_in.read()
with open('result_utf8.txt', 'w', encoding='utf-8') as f_out:
f_out.write(text)
Если текст содержит символы, не представимые в целевой кодировке, возникнет ошибка. Можно использовать режим errors='replace'.
Параллельное чтение нескольких файлов с помощью потоков (threading)
Ускоряет обработку, когда файлы находятся на разных дисках или требуется агрегация.
import threading
def read_file(filename):
with open(filename, 'r', encoding='utf-8') as f:
content = f.read()
print(f'{filename}: {len(content)} символов')
threads = []
for fname in ['file1.txt', 'file2.txt', 'file3.txt']:
t = threading.Thread(target=read_file, args=(fname,))
threads.append(t)
t.start()
for t in threads:
t.join()
file1.txt: 1234 символов file2.txt: 567 символов file3.txt: 890 символов