34 KiB
Тема 6. Ввод-вывод данных и операции с файлами
Выполнил: Тимошенко А.А. Проверил: Козлюк Д.А.
Пункт 1
>>> import os
>>> os.chdir("C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6")
Пункт 2. Вывод данных на экран дисплея.
Пункт 2.1. Вывод данных в командной строке.
Эхо-вывод в терминал
>>> stroka='Автоматизированная система управления'
>>> stroka
'Автоматизированная система управления'
Пункт 2.2 Вывод с использованием функции print
>>> help(print)
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
>>> fff = 234.5; gg = 'Значение температуры = '
>>> print(gg, fff)
Значение температуры = 234.5
Это работает и в терминале, и в скриптах, которые записаны в файлы .ру. Причем видно, что вывод через print() убирает у строки кавычки при выводе.
По умолчанию выводимые объекты разделяются через пробел, но это можно изменить, задав значение сепаратору sep:
>>> print(gg, fff, sep='/')
Значение температуры = /234.5
По умолчанию после того, как функция print() сделала вывод, происходит перенос курсора на следующую строку. Это тоже можно изменить. Параметр end по умолчанию имеет значение "\n", его можно изменить на другое.
>>> print(gg, fff,sep = '/', end = '***'); print('____')
Значение температуры = /234.5***____
Можно просто вызвать перенос курсора без какого-либо текста, вызвав print() без аргументов:
>>> print()
>>>
Если текст большой, можно расположить его в несколько строк:
>>> print(""" Здесь может выводиться
большой текст,
занимающий несколько строк""")
Здесь может выводиться
большой текст,
занимающий несколько строк
Или переносить отдельные объекты, разделенные запятой:
>>> print("Здесь может выводиться",
"большой текст,",
"занимающий несколько строк")
Здесь может выводиться большой текст, занимающий несколько строк
Разница в том, что в первом случае тройные кавычки воспроизводят текст ровно так, как он был введен. В тексте были введены переносы строки, но они были введены не как символ \n, а в обычном, человеку понятном виде. Во втором случае три выводимых объекта-строки перечисленны через запятую, и это работает как обычный print(), разделяющий объекты с помощью пробелов, если не указано иное.
Пункт 2.3. Вывод с использованием write объекта stdout (поток стандартного вывода) модуля sys.
>>> import sys
>>> help(sys.stdout.write)
Help on method write in module idlelib.run:
write(s) method of idlelib.run.StdOutputFile instance
Write string to stream.
Returns the number of characters written (which is always equal to
the length of the string).
>>> sys.stdout.write("Функция write")
Функция write13
По умолчанию каретка не переводится! Если нужно перевести, это нужно указать вручную.
>>> sys.stdout.write("Функция write\n")
Функция write
14
Важно отметить, что функция выводит текст, но возвращает число. Это число - количество введенных символов, причем \n считается за один символ, а не за два. Это можно проверить:
>>> type(sys.stdout.write("Функция write"))
Функция write<class 'int'>
Если вызвать эту функцию без аргументов, вернется ошибка:
>>> sys.stdout.write()
Traceback (most recent call last):
...
TypeError: write() missing 1 required positional argument: 's'
Если сообщить пустую строку, то, соответственно, 0.
>>> sys.stdout.write("")
0
Пункт 3. Ввод данных с клавиатуры.
>>> help(input)
Help on built-in function input in module builtins:
input(prompt=None, /)
Read a string from standard input. The trailing newline is stripped.
The prompt string, if given, is printed to standard output without a
trailing newline before reading input.
If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.
On *nix systems, readline is used if available.
Функция input() приостанавливает дальнейшее выполнение программы и ожидает ввод от пользователя. Выполнение программы продолжится только после нажатия Enter. input() всегда возвращает строку, даже если ввести числа или, например, функцию. Если нужна не строка, то input надо поместить внутрь функции, изменяющей тип данных. Например, int(input()).
input() может принимать один аргумент: приглашение для пользователя. Это тоже строка, и с помощью нее можно конкретизировать для человека, что означают данные, которые он вводит. При этом после вывода строки-приглашения каретка не переносится, пробел не ставится.
>>> psw = input('Введите пароль:')
Введите пароль:123456789
>>> psw
'123456789'
>>> type(psw)
<class 'str'>
Пример 1
>>> while True:
znach=float(input('Задайте коэф.усиления = '))
if znach < 17.5 or znach > 23.8:
print('Ошибка!')
else:
break
Задайте коэф.усиления = 15.4
Ошибка!
Задайте коэф.усиления = 21.6
Пример 2
>>> import math
>>> print(eval(input('введите выражение для расчета = ')))
введите выражение для расчета = math.log10(23 / (1 + math.exp(-3.24)))
1.34504378689765
Введенная через input() строка преобразуется в исполнительные инструкции с помощью eval(), они потом выполняются и результат выводится на экран. Строка имеет тип, соответствующий результату вычислений и задаваемый автоматически:
>>> type(eval(input('введите выражение для расчета = ')))
введите выражение для расчета = 1+2
<class 'int'>
>>> type(eval(input('введите выражение для расчета = ')))
введите выражение для расчета = math.log10(23/(1+math.exp(-3.24)))
<class 'float'>
Пункт 4. Ввод-вывод при работе с файлами.
Пункт 4.1. Функции для работы с путём к файлу.
>>> import os
>>> os.getcwd()
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6'
>>> timoshenko = os.getcwd()
>>> timoshenko # Если просто сделать эхо-вывод, бекслеши будут двойными.
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6'
>>> print(timoshenko) # Если сделать вывод с print(), то одинарными.
C:\Users\mapon\OneDrive\Рабочий стол\ПО АС\ТЕМА6
Сменим директорию и посмотрим, что смена произошла:
>>> os.chdir("C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6")
>>> os.getcwd()
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6'
Создание каталога (mkdir)
>>> help(os.mkdir)
mkdir(path, mode=511, *, dir_fd=None)
Create a directory.
If dir_fd is not None, it should be a file descriptor open to a directory,
and path should be relative; path will then be relative to that directory.
dir_fd may not be implemented on your platform.
If it is unavailable, using it will raise a NotImplementedError.
The mode argument is ignored on Windows.
>>> help(os.mkdir)
>>> os.chdir("test")
>>> os.getcwd()
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6\\test'
Теперь путь от самого диска можно не указывать, т.к. мы уже находимся в нужной корневой папке. Функция вернет FileExistsError, если папка с таким именем уже существует в текущей директории.
mode - нужно для настройки прав доступа.
Удаление каталога
>>> help(os.rmdir)
Help on built-in function rmdir in module nt:
rmdir(path, *, dir_fd=None)
Remove a directory.
If dir_fd is not None, it should be a file descriptor open to a directory,
and path should be relative; path will then be relative to that directory.
dir_fd may not be implemented on your platform.
If it is unavailable, using it will raise a NotImplementedError.
- Не получится удалить каталог, в котором находимся мы, обратившись по полному пути. Это вернет ошибку:
>>> os.rmdir('C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6\\test')
Traceback (most recent call last):
File "<pyshell#43>", line 1, in <module>
os.rmdir('C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6\\test')
PermissionError: [WinError 32] Процесс не может получить доступ к файлу, так как этот файл занят другим процессом: 'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6\\test'
- Для того, чтобы корректно выполнить удаление той папки, где мы находимся, надо сначала подняться на уровень выше, и уже там произвести удаление:
>>> os.getcwd()
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6\\test'
>>> os.chdir('../') # Поднимает нас на одну папку выше. ../../ - для двух папок и т.д.
>>> os.getcwd()
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6'
>>> os.rmdir("test")
- Попробуем удалить эту папку еще раз.
>>> os.rmdir("test")
Traceback (most recent call last):
File "<pyshell#48>", line 1, in <module>
os.rmdir("test")
FileNotFoundError: [WinError 2] Не удается найти указанный файл: 'test'
Показать список всех файлов и папок, вложенных в текущую
>>> help(os.listdir)
Help on built-in function listdir in module nt:
listdir(path=None)
Return a list containing the names of the files in the directory.
path can be specified as either str, bytes, or a path-like object. If path is bytes,
the filenames returned will also be bytes; in all other circumstances
the filenames returned will be str.
If path is None, uses the path='.'.
On some platforms, path may also be specified as an open file descriptor;\
the file descriptor must refer to a directory.
If this functionality is unavailable, using it raises NotImplementedError.
The list is in arbitrary order. It does not include the special
entries '.' and '..' even if they are present in the directory.
Проверка существования каталога
>>> help(os.path.isdir)
Help on function isdir in module genericpath:
isdir(s)
Return true if the pathname refers to an existing directory.
Функция isdir() модуля os.path возвращает True если путь path существует и является каталогом, False в противном случае.
>>> os.path.isdir("ИКЗ")
True
>>> os.path.isdir("фотографии людей")
False
>>> os.path.isdir("testest.txt") # Такой файл существует, но это не каталог, поэтому False.
False
Возвращение абсолютного пути
Функция os.path.abspath() в Python преобразует путь, переданный в качестве аргумента, в абсолютный путь.
>>> fil = os.path.abspath("testest.txt") # Такой файл есть
>>> fil
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\testest.txt'
>>> fil = os.path.abspath("test.txt") #Такого файла не существует
>>> fil
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\test.txt'
Абсолютный путь — это полный путь к файлу или каталогу, начиная от корневого каталога системы, а не относительный путь (который зависит от текущего рабочего каталога).
Если передать в os.path.abspath() несуществующий файл или каталог, функция не проверяет наличие этого файла в файловой системе. Она просто преобразует путь в абсолютный, не проверяя его существование.
Отделение из абсолютного пути только каталога/только имени файла
Функция os.path.dirname() из абсолютного пути выделяется путь доступа (от диска до последней папки). Функция os.path.basename(), наоборот, убирает из абсолютного пути все, кроме имени файла.
>>> drkt = os.path.dirname(fil)
>>> print(drkt)
C:\Users\mapon\OneDrive\Рабочий стол\ПО АС\ТЕМА6
>>> bsnm = os.path.basename(fil)
>>> print(bsnm)
test.txt
Разделение на кортеж из пути и из имени файла
>>> os.path.split(fil)
('C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6', 'test.txt')
>>> type(os.path.split(fil))
<class 'tuple'>
Проверка существования любого объекта (пути или файла)
>>> os.path.exists("C:/GAMES") # Такой каталог есть на ПК
True
>>> os.path.exists("C:/Arts") # Такого каталога нет
False
>>> os.path.exists("C:/Users/mapon/OneDrive/Рабочий стол/NIR/Тимошенко А-01-23 НИР Этап2.docx")
# Такой файл есть
True
>>> os.path.exists("C:/GAMES/abcd.jpg") # Такого файла нет
False
Проверка существования файла
>>> os.path.isfile("C:/Users/mapon/OneDrive/Рабочий стол/NIR/Тимошенко А-01-23 НИР Этап2.docx")
# Это есть и это файл
True
>>> os.path.isfile("C:/Users/mapon/OneDrive/Рабочий стол/NIR/") # Это есть, но это не файл!
False
>>> os.path.isfile("C:/GAMES/abcd.jpg") # Это файл, но его не существует
False
Пункт 4.2 Общая схема работы с файлом
Для обмена данными с файлом необходимо выполнить следующие операции: • Открытие файла с указанием его имени и цели (чтение, запись, добавление данных); • Выполнение одной или нескольких операций обмена данными с файлом; • Закрытие файла.
Пункт 4.3 Открытие файла для записи или чтения
>>> fp = open(file = drkt+'\\zapis1.txt', mode='w')
>>> type(fp)
<class '_io.TextIOWrapper'>
Объект класса _io.TextIOWrapper - файловый объект для текстовых данных, имеющий ряд атрибутов и методов.
>>> fp
<_io.TextIOWrapper name='C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\zapis1.txt' mode='w' encoding='cp1251'>
Здесь перечислены атрибуты объекта: name - абсолютный путь mode - режим: r - чтение w - запись (если такой файл уже есть, его содержимое будет удалено, если нет, создается. Содержимое удаляется в момент открытия, а не в момент первой записи) a - дозапись (в конец) x - открывает для записи, но только если файл есть, иначе FileExistsError. + - чтение и запись: r+ - чтение и запись, файл должен существовать. w+ - запись и чтение, файл создаётся или перезаписывается. a+ - добавление и чтение, файл создаётся, если не существует.
>>> fp.closed
False
Если имя файла на первом месте, а режим на втором, то имена можно не указывать. (позиционные аргументы всегда должны идти первыми, а именованные — после них)
Путь можно опустить, если он совпадает с текущей рабочей директории:
>>> fp = open('zapis1.txt','w')
>>> fp
<_io.TextIOWrapper name='zapis1.txt' mode='w' encoding='cp1251'>
Список атрибутов объекта fp:
>>> dir(fp)
['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__',
'__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__gt__',
'__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__',
'__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable',
'_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach',
'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name',
'newlines', 'read', 'readable', 'readline', 'readlines', 'reconfigure', 'seek', 'seekable',
'tell', 'truncate', 'writable', 'write', 'write_through', 'writelines']
Пример открытия бинарного файла:
>>> fp1 = open(drkt + '\\zapis2.bin', mode = 'wb+')
>>> fp1
<_io.BufferedRandom name='C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\zapis2.bin'>
Пункт 4.4. Закрытие файла.
Когда файл успешно открывается / создается и открывается, ему задается целочисленный номер, называемый файловым дескриптором. Он создается только на один сеанс работы и указывает, с каким именно файлом нужно работать.
После того, как программа отработала, надо очистить ресурсы, связанные с файлом (область в оперативной памяти, в буфере при буферизации), и удалить дескриптор. Если не закрыть файл, это может его повредить, данные могут быть утеряны или система может быть перегружена, т.к. исчерпается ресурс оперативной памяти. Для закрытия есть метод close().
После закрытия на объект все еще можно посмотреть:
>>> fp.close()
>>> fp
<_io.TextIOWrapper name='zapis1.txt' mode='w' encoding='cp1251'>
Но значение атрибута closed сменится на True:
>>> fp.closed
True
Пункт 4.5. Запись информации в файл.
>>> help(fp.write)
Help on built-in function write:
write(text, /) method of _io.TextIOWrapper instance
Write string to stream.
Returns the number of characters written (which is always equal to
the length of the string).
Выполним операции над файлом:
>>> sps = list(range(1,13))
>>> sps
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> fp2 = open('zapis3.txt','w')
>>> fp2.write(str(sps[:4]) + '\n')
13
>>> fp2.write(str(sps[4:8]) + '\n')
13
>>> fp2.write(str(sps[8:]) + '\n')
16
>>> fp2.close()
Посмотрим, как выглядит файл, в текстовом редакторе:
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]
В файл записались преобразованные в строки срезы списка. Второй и последущие вызовы write() в рамках одного сеанса не стирают содержимое файла. Метод выполняет действия по записи данных в файл, но возвращает количество записанных символов.
Создадим другой список и попробуем записать его в файл:
>>> sps3 = [['Тимошенко А.',1],['Ходюк М.',2],['Коваленко Д.',3]]
>>> sps3
[['Тимошенко А.', 1], ['Ходюк М.', 2], ['Коваленко Д.', 3]]
>>> fp3 = open('zapis4.txt','w')
>>> for i in range(len(sps3)):
stroka4 = sps3[i][0] + ' ' + str(sps3[i][1])
fp3.write(stroka4)
14
10
14
>>> fp3.close()
Файл в текстовом редакторе выглядит так:
Тимошенко А. 1Ходюк М. 2Коваленко Д. 3
Видно, что строки склеились там, где не надо. Попробуем по-другому.
>>> gh = open('zapis5.txt','w')
>>> for r in sps3:
gh.write(r[0] + ' '+str(r[1]) + '\n')
15
11
15
>>> gh.close()
Мы добавили перенос каретки на каждой итерации цикла и пробел в нужном месте. Стало так:
Тимошенко А. 1 Ходюк М. 2 Коваленко Д. 3
>>> gh = open('zapis5.txt','w')
>>> for r in sps3: gh.write(r[0]+' '+str(r[1])+'\n')
15
11
15
>>> gh.close()
Тимошенко А. 1 Ходюк М. 2 Коваленко Д. 3
Пункт 4.6. Чтение из файла, способ 1.
>>> sps1 = []
>>> fp = open('zapis3.txt')
Здесь используется только один аргумент — имя файла, что означает, что файл будет открыт в режиме чтения по умолчанию.
>>> for stroka in fp:
stroka = stroka.rstrip('\n')
stroka = stroka.replace('[','')
stroka = stroka.replace(']','')
sps1 = sps1 + stroka.split(',') # на этот моменте целые числа превращаются в строки
Метод .rstrip() убирает символы с конца строки. Если не задавать аргументов, он удалит любые пробелы (пробел, табуляция, символы новой строки и т.п.) с конца строки.
Метод .replace() заменяет первый агрумент на второй. С помощью него мы убираем скобки.
>>> fp.close()
>>> sps1
['1', ' 2', ' 3', ' 4', '5', ' 6', ' 7', ' 8', '9', ' 10', ' 11', ' 12']
Видно, что полученный список отличается от исходного sps, в первую очередь, типом данных. К тому же, в sps1 убрались не все пробелы. Преобразовать sps1 в sps можно, например, так:
>>> sps2 = [int(i.strip()) for i in sps1]
>>> sps2
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Это list comprehension, который у каждого элемента sps1 убирает лишние пробелы с обеих сторон (в этом отличие rstrip от strip). Затем полученная строка конвертируется в число.
Пункт 4.7. Чтение информации из файла с помощью метода read.
Этой функции передается количество символов или, если открыт бинарный файл, - количество байт, которое должно быть прочитано, соответственно, из текстового или бинарного файла, начиная с текущего положения маркера. Если указать число большее, чем длина файла, или любое отрицательное, или не передавать вообще, будет прочитан весь файл до EOF.
>>> fp = open('zapis3.txt')
>>> stroka1 = fp.read(12) # Чтение первых 12 файлов, курсор остановится на 13-ом (/n)
>>> stroka2 = fp.read() # Чтение всех оставшихся файлов вплоть до EOF
>>> fp.close()
>>> stroka1
'[1, 2, 3, 4]'
>>> stroka2
'\n[5, 6, 7, 8]\n[9, 10, 11, 12]\n'
Пункт 4.8. Чтение информации с помощью readline и readlines.
Метод readline() считывает одну строку из файла за один вызов. Он читает символы до тех пор, пока не встретит символ новой строки (\n; включается в строку) или конец файла (EOF). Если файл содержит только одну строку или указатель чтения находится в конце файла, то при вызове readline() будет возвращена пустая строка.
Метод readlines() считывает все строки файла и возвращает их в виде списка, где каждая строка — это отдельный элемент списка. Каждая строка в списке будет содержать символ новой строки \n, если он есть в файле.
>>> file = open("zapis5.txt")
>>> file.readline()
'Тимошенко А. 1\n'
>>> file.seek(0) # Вовзращение указателя обратно в начало, чтобы нагляднее выполнить
readlines
0
>>> file.readlines()
['Тимошенко А. 1\n', 'Ходюк М. 2\n', 'Коваленко Д. 3\n']
Пункт 4.9. Ввод-вывод объектов с использованием функций из модуля pickle.
Этот модуль предназначен для сериализации (перевода в бинарную форму) объектов.
>>> import pickle
>>> mnoz1={'pen','book','pen','iPhone','table','book'}
>>> fp = open('zapis6.mnz', 'wb') # открывается с предварительным созданием файл на
бинарную запись
>>> pickle.dump(mnoz1, fp) # сериализация - запись в бинарный вид
>>> fp.close()
Откроем получившийся файл в текстовом редакторе, увидим подобную строку.
耄锣 鐨谄扯潫钌մ慢汥钌٩偨潮斔调灥溔逮
Так происходит, потому что байты в этом файле не предназначены для текстового представления. Они могут содержать символы, которые не могут быть корректно интерпретированы в рамках любой текстовой кодировки. Но в некоторых байтах содержатся символы, которые попадают в диапазон, поддерживаемый текстовым редактором и конкретной кодировкой (в моем случае ANSI), поэтому правильно дешифрованные буквы все же есть.
Десериализуем множество обратно:
>>> fp = open('zapis6.mnz','rb')
>>> mnoz2=pickle.load(fp)
>>> fp.close()
>>> mnoz2
{'book', 'iPhone', 'table', 'pen'}
>>> mnoz1
{'iPhone', 'book', 'pen', 'table'}
>>> mnoz1 == mnoz2
True
mnoz1 не совпадает с тем, что было задано, потому что это множество. Оно исключает повторяющиеся элементы, оставляя только один, а еще не содержит конкретный порядок элементов. Но два множества равны, если у них равны все элементы и их одинаковое количество, вне зависимости от порядка, так что сравнение возвращает True.
>>> fp = open('zapis7.2ob','wb')
>>> pickle.dump(mnoz1,fp)
>>> pickle.dump(sps3,fp)
>>> fp.close()
>>> fp = open('zapis7.2ob','rb')
>>> obj1 = pickle.load(fp)
>>> obj2 = pickle.load(fp)
>>> fp.close()
>>> obj1
{'book', 'table', 'iPhone', 'pen'}
>>> obj2
[['Тимошенко А.', 1], ['Ходюк М.', 2], ['Коваленко Д.', 3]]
>>> mnoz1 == obj1
True
>>> obj2 == sps3
True
Примечание: .mnz и .2ob - пользовательские расширения, не относящиеся к стандартным.
Пункт 5. Перенаправление потоков ввода и вывода данных.
Поток в python и других ЯП - это абстракция, которая позволяет регулировать источники ввода информации и то, куда её выводить. Всего их по умолчанию три (еще можнно создать пользовательские): sys.stdin — поток ввода (обычно клавиатура) sys.stdout — поток вывода sys.stderr — поток ошибок (оба обычно экран)
Для работы с потоками импортируем модуль sys:
>>> import sys
Сохраним адрес в памяти текущего потока вывода:
>>> vr_out = sys.stdout
>>> vr_out
<idlelib.run.StdOutputFile object at 0x000002CCB1927040>
Откроем (созадем) файл на запись:
>>> fc = open('Stroka.txt','w')
Теперь зададим в качестве потока вывода этот файл:
>>> sys.stdout = fc
>>> print('запись строки в файл')
Видно, что в консоли не появилось строки. Вернем поток по умолчанию обратно:
>>> sys.stdout = vr_out
>>> print('запись строки на экран')
запись строки на экран
>>> fc.close()
В файле Stroka.txt находится: запись строки в файл
Можно перенаправить и поток ввода тоже. Например, на файл:
>>> tmp_in = sys.stdin
>>> fd = open("Stroka.txt", "r")
>>> sys.stdin = fd
>>> sys.stdin
<_io.TextIOWrapper name='Stroka.txt' mode='r' encoding='cp1251'>
>>> while True:
try: # Конструкция try-except предназначена для отладки исключений
# То есть если возвращается ошибка, можно ее перехватить и
# указать, что делать в таком случае
line = input()
print(line)
except EOFError:
break
запись строки в файл
>>> fd.close()
>>> sys.stdin = tmp_in #Вернул стандартное назначение для потока ввода