Работа с вводом и выводом в Python (консольный и файловый)

Раздел: Основы 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.

Решение: всегда явно преобразовывать элементы в строки.

- Python config files (конфигурационные файлы в python)
- Python copy file (копирование файла в python)
- Python log file (логирование в файл в python)

Расширенные примеры работы с вводом и выводом

Чтение 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 символов
  

Задачи на ввод и вывод в Python - comments

En
задачи python ввод вывод (python)