Работа со стандартным вводом (stdin) в 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 не будет закрыт после завершения работы (что обычно безопасно).
Расширенные примеры работы с 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