Работа со стандартным вводом (stdin) в Python

Раздел: Основы Python -> Файловый ввод-вывод

Чтение данных из стандартного ввода (stdin) - одна из базовых операций при разработке консольных утилит, фильтров и обработчиков потоков. В Python доступ к stdin осуществляется через объект sys.stdin, который представляет собой файловый объект (file-like object).

Основные методы чтения из stdin

Как эффективно прочитать все строки из stdin без загрузки всего содержимого в память?

Наиболее производительный способ для обработки больших объёмов данных - итерация по sys.stdin в цикле for. Этот метод не требует предварительного чтения всего файла: строки подгружаются по мере необходимости.

import sys

print("Введите строки (Ctrl+D или Ctrl+Z для завершения):")
for line in sys.stdin:
    processed = line.strip()
    if processed:
        print(f"Обработано: {processed}")

ввод программ на python (ввод данных в программе python)

Введите строки (Ctrl+D или Ctrl+Z для завершения):
Привет
мир
Обработано: Привет
Обработано: мир

Python file io (ввод-вывод файлов в python)

Пояснение:

  • sys.stdin возвращает итератор, разбивающий ввод по символам новой строки.
  • Метод strip() убирает лишние пробельные символы, включая \n.
  • Цикл завершается при получении сигнала конца файла (Ctrl+D в Unix, Ctrl+Z+Enter в Windows).

Типичная ошибка:

Использование readlines() загружает все строки в список, что может привести к переполнению памяти при большом объёме ввода.

# НЕ РЕКОМЕНДУЕТСЯ для больших данных:
lines = sys.stdin.readlines()  # список в памяти
for l in lines:
    ...

Python temp files (временные файлы в python)

Как прочитать одну строку ввода с клавиатуры?

Функция input() читает строку до символа новой строки. Она автоматически убирает \n и возвращает строку (или вызывает EOFError при преждевременном конце файла).

name = input("Ваше имя: ")
print(f"Привет, {name}!")

Python index files (индексация файлов в python)

Ваше имя: Иван
Привет, Иван!

File python class (класс для работы с файлами в python)

Проблема:

При перенаправлении ввода из файла input() может спровоцировать EOFError, если строк в файле недостаточно. Следует оборачивать вызов в try-except.

try:
    line = input()
except EOFError:
    print("Ввод закончился")

Python file utf 8 (кодировка utf-8 для файлов в python)

Как прочитать весь ввод целиком как одну строку?

Метод sys.stdin.read() считывает всё содержимое (до EOF) в одну строку. Удобно, если необходимо обработать данные целиком, например, для поиска или замены.

import sys

data = sys.stdin.read()
print(f"Общее количество символов: {len(data)}")
print("Первые 100 символов:")
print(data[:100])

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

Общее количество символов: 12345
Первые 100 символов:
Lorem ipsum dolor sit amet, consectetur adipiscing elit...

Python copy file (копирование файла в python)

Предостережение:

При большом объёме данных (например, гигабайтные логи) вызов read() может привести к нехватке памяти. Используйте этот метод только для файлов, размер которых заведомо помещается в ОЗУ.

Как построчно читать данные с явным контролем буферизации?

Метод sys.stdin.readline() читает ровно одну строку (включая завершающий \n). Он полезен, если требуется точно управлять позицией чтения или эмулировать поведение fgets.

import sys

line = sys.stdin.readline()
while line:
    print(f"Прочитана строка: {line!r}")
    line = sys.stdin.readline()

Python log file (логирование в файл в python)

Частая ошибка:

Забывают, что readline() возвращает пустую строку ('') только при достижении конца файла, а не пустую строку из ввода. Пустая строка в файле содержит '\n'. Поэтому условие while line: корректно завершает цикл только при EOF.

Как читать двоичные данные из stdin (например, изображения или архивы)?

Для работы с бинарными данными следует использовать sys.stdin.buffer - буферизированный поток байтов. Он поддерживает методы read(), readinto() и т.д.

import sys

raw_data = sys.stdin.buffer.read()
print(f"Прочитано {len(raw_data)} байт")
# Например, сохранить в файл:
with open('output.bin', 'wb') as f:
    f.write(raw_data)

Python file methods (методы работы с файлами в python)

Осторожно:

Не смешивайте текстовый (sys.stdin) и бинарный (sys.stdin.buffer) доступ. После чтения из буфера объект sys.stdin может сместить позицию, что приведёт к непредсказуемым результатам.

Как обработать аргументы командной строки совместно с вводом из stdin?

Модуль argparse можно комбинировать с чтением из sys.stdin. Например, если не указан файл, скрипт читает из stdin.

import argparse
import sys

parser = argparse.ArgumentParser()
parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
args = parser.parse_args()

for line in args.infile:
    print(line, end='')

File models in python (модели файлов в python)

$ python script.py input.txt   # читает из файла
$ echo "Hello" | python script.py  # читает из stdin

Нюанс:

При использовании argparse.FileType('r') файл автоматически открывается и закрывается. Если оставить default=sys.stdin, то sys.stdin не будет закрыт после завершения работы (что обычно безопасно).

- Python file position (позиционирование в файле python)
- Python line find (поиск строки в файле python)
- Python csv file (работа с csv файлами в python)

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

1. Чтение с явным ограничением по размеру

Полезно при обработке потоков фиксированной длины, например, в сетевых протоколах.

Пример
import sys

# читаем ровно 10 байт из бинарного stdin
chunk = sys.stdin.buffer.read(10)
print(f"Получено {len(chunk)} байт: {chunk}")

2. Построчная обработка с прогресс-баром (tqdm)

Пример
import sys
from tqdm import tqdm

# подсчёт строк с отображением индикатора
total = 0
for line in tqdm(sys.stdin, desc="Обработка строк"):
    total += 1
print(f"Всего строк: {total}")

3. Фильтрация строк с регулярными выражениями

Пример
import sys
import re

pattern = re.compile(r'\d+')
for line in sys.stdin:
    if pattern.search(line):
        print(line, end='')

4. Чтение из stdin с сохранением позиции (с помощью tell/seek)

sys.stdin поддерживает файловые операции, если он не является терминалом (при перенаправлении из файла или pipe).

Пример
import sys

pos = sys.stdin.tell()
first_line = sys.stdin.readline()
print(f"Первая строка: {first_line!r}")
sys.stdin.seek(pos)  # возвращаемся в начало
for l in sys.stdin:
    print(l, end='')
(работает только если stdin - файл, а не терминал)

5. Многопоточное чтение из stdin (осторожно)

Не рекомендуется из-за глобальной блокировки интерпретатора (GIL), но можно использовать multiprocessing для отдельных процессов.

Пример
import sys
from concurrent.futures import ThreadPoolExecutor

def process_line(line):
    # имитация долгой обработки
    return line.strip().upper()

with ThreadPoolExecutor(max_workers=4) as executor:
    results = executor.map(process_line, sys.stdin)

6. Чтение из stdin с использованием модуля fileinput (удобен для обработки нескольких файлов)

Пример
import fileinput

for line in fileinput.input():
    if fileinput.isfirstline():
        print(f"--- {fileinput.filename()} ---")
    print(line, end='')
$ python my_script.py file1.txt file2.txt
--- file1.txt ---
содержимое файла 1
--- file2.txt ---
содержимое файла 2

7. Симуляция Ctrl+D из кода (тестирование)

Пример
import sys
import io

# создаём фиктивный stdin
test_input = "строка1\nстрока2\n"
sys.stdin = io.StringIO(test_input)

for line in sys.stdin:
    print(line.strip())
# восстанавливаем реальный stdin
sys.stdin = sys.__stdin__
строка1
строка2

Чтение из стандартного ввода (stdin) - comments

En
File stdin python (python)