# Отчёт по теме 6 Зеленкина Катерина Михайловна, А-02-23 ## Пункт 1.Запуск оболочки IDLE ## Пункт 2. Вывод данных на экран дисплея ### 2.1. Вывод в командной строке. Cодержимое любого объекта можно увидеть простым упоминанием его в командной строке (как это много раз делалось раньше), например: ```py >>> stroka='Автоматизированная система управления' >>> stroka 'Автоматизированная система управления' ``` Этот способ называется __«эхо-выводом»__ ### 2.2. Функция print Этот способ можно применять и в командной строке, и в функциях ```py >>> fff=234.5;gg='Значение температуры = ' >>> print(gg, fff) Значение температуры = 234.5 ``` Можно вывести несколько объектов за одно обращение к функции. По умолчанию выводимые объекты разделяются одним пробелом. Если нужен другой разделитель его можно указать в отдельном аргументе sep, например: ```py >>> print(gg, fff, sep='/') Значение температуры = /234.5 ``` После вывода автоматически осуществляется переход на другую строку. Если курсор надо оставить в той же строке, то следует использовать еще один аргумент, например: ```py >>> print(gg, fff,sep='/',end='***'); print('____') Значение температуры = /234.5***____ ``` После end= надо указать какими символами должна закончиться выводимая строка или указать пустую строку. Наоборот, если в какой-то момент требуется просто перейти на новую строку, можно использовать такое обращение к функции: ```py print() ``` Оператор вывода может располагаться на нескольких строках с использованием тройных кавычек: ```py #1-й вариант >>> print(""" Здесь может выводиться ... большой текст, ... занимающий несколько строк""") Здесь может выводиться большой текст, занимающий несколько строк #2-й вариант >>> print("Здесь может выводиться", ... "большой текст,", ... "занимающий несколько строк") Здесь может выводиться большой текст, занимающий несколько строк ``` Вывод: Во 1-ом варианте текст выводится в три отдельные строки как и при вводе команды, благодаря троиным кавычкам ### 2.3. Вывод с использованием метода write объекта sys.stdou. Объект stdout представляет собой поток стандартного вывода – объект, в который программы вы-водят символьное представление данных. Объект находится в модуле __sys__ , который надо импортировать: ```py >>> import sys >>> sys.stdout.write('Функция write') Функция write13 ``` Этот метод после вывода строки не осуществляет переход на новую строку. Добавим в конце строки один или несколько символов “\n”: ```py >>> sys.stdout.write('Функция write\n') Функция write 14 ``` ## Пункт 3. Ввод данных с клавиатуры. Для ввода используем знакомую функцию input. Например: ```py >>> psw=input('Введите пароль:') Введите пароль:12345 >>> psw '12345' >>> type(psw) ``` ### Пример 1. Ввод с контролем значения. Пусть вводится число, которое должно находиться в интервале значе-ний от 17.5 до 23.8. ```py >>> while True: ... znach=float(input('Задайте коэф.усиления = ')) ... if znach<17.5 or znach>23.8: ... print('Ошибка!') ... else: ... break Задайте коэф.усиления = 15.4 Ошибка! Задайте коэф.усиления = 21.6 ``` ### Пример 2. Ввод и обработка выражения, подлежащего расчету. ```py >>> import math >>> print(eval(input('введите выражение для расчета = '))) введите выражение для расчета = math.log10(23/(1+math.exp(-3.24))) 1.34504378689765 ``` ## Пункт 4. Ввод-вывод при работе с файлами. Работа с файлом требует указания источника данных - полного имени файла с путем доступа к его расположению. ### 4.1. Функции для работы с путем к файлу. Эти функции собраны в модуле os. Импортируем этот модуль и узнаем, какой рабочий каталог установлен в текущей момент времени с помощью os.getcwd (cwd = current working directory). ```py >>> import os >>> os.getcwd() 'C:\\Users\\user\\python-labs\\TEMA6' ``` Сохраним этот путь в переменной с именем ZelenkinaK и выведим с помощью «print» ```py ZelenkinaK=os.getcwd() print(ZelenkinaK) C:\Users\user\python-labs\TEMA6 ``` Изменить расположение рабочего каталога можно обращением к уже многократно применявшейся функции __os.chdir__ ```py os.chdir(r'C:\Users\user\python-labs\TEMA1') os.getcwd() 'C:\\Users\\user\\python-labs\\TEMA1' ``` Самостоятельно изучите и попробуйте использовать следующие функции из модуля os: __mkdir__, __rmdir__, __listdir__ и функцию __isdir__ из вложенного в os модуля os.path. ```py >>> import os >>> from os.path import isdir # mkdir - создаёт папку >>> os.mkdir("Секретная_папка") # isdir - проверяет наличие папки >>> print(isdir("Секретная_папка")) True # listdir - просматривает содержимое текущей директории >>> print(os.listdir()) ['.gitkeep', 'report.md', 'Секретная_папка'] # rmdit - удаляет пустую папку >>> os.rmdir("Секретная_папка") >>> print(isdir("Секретная_папка")) False ``` Пусть в рабочем каталоге находится файл report.md. С помощью функции __os.path.abspath__ получим символьную строку, содержащую имя файла вместе с полным путем доступа к нему: ```py >>> fil=os.path.abspath("report.md") >>> print(fil) C:\Users\user\python-labs\TEMA6\report.md ``` Выделим путь доступа к файлу из строки, содержащей и этот путь, и имя файла с помощью функции __os.path.dirname__: ```py >>> drkt=os.path.dirname(fil) >>> print(drkt) C:\Users\user\python-labs\TEMA6 ``` Наоборот, выделить имя файла из этой строки с отбрасыванием пути можно с помощью функции __os.path.basename__. ```py >>> file1 = os.path.basename(fil) >>> print(file1) report.md ``` Самостоятельно изучим функцию __os.path.split__ (возвращает кортеж (путь, имя_файла)): ```py >>> file2 = os.path.split(fil); print(file2) ('C:\\Users\\user\\python-labs\\TEMA6', 'report.md') ``` С помощью функции __os.path.exists__ можно проверить существует ли путь: ```py >>> os.path.exists(r'C:\Users\user\python-labs\TEMA6') True >>> os.path.exists(r'C:\\Users\\user\\python-labs\\Дом') False >>> os.path.exists('file') False ``` Проверим наличие файла с известным расположением с помощью функции __os.path.isfile__, аргументом которой должна быть символьная строка с путем и именем интересующего файла: ```py >>> a=os.path.isfile(r'C:\Users\user\python-labs\TEMA6\report.md') >>> print(a) True ``` ###4.2. Общая схема работы с файлом. Для обмена данными с файлом необходимо выполнить следующие операции: 1. Открытие файла с указанием его имени и цели (чтение, запись, добавление данных); 2. Выполнение одной или нескольких операций обмена данными с файлом; 3. Закрытие файла. ## Пункт 4.3. Функция __open__ Функция __open__ - открытие файла для записи или чтения данных. Запросим помощь: ```py >>> help(open) Help on built-in function open in module _io: open( file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None ) Open file and return a stream. Raise OSError upon failure. ... It is also possible to use a string or bytearray as a file for both reading and writing. For strings StringIO can be used like a file opened in a text mode, and for bytes a BytesIO can be used like a file opened in a binary mode. ``` При открытии файла необходимо указать имя файлы (с путем, если он не в рабочем каталоге) и цель работы с ним. Для открытия используется функция open. ```py fp=open(file=drkt+'\\zapis1.txt',mode='w') ``` Более короткая запись (без имен аргументов): ```py fp=open(drkt+'\\zapis1.txt','w') ``` Если путь в переменной drkt совпадает с рабочим каталогом, то его можно опустить, оставив только имя открываемого файла: ```py fp=open('zapis1.txt','w') ``` Отобразим тип и список атрибутов: ```py >>> print(type(fp)) >>> dir(fp) ['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__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'] ``` ## Пункт 4.4. Закрытие файла. Сразу после завершения работы с файлом его следует закрыть для обеспечения сохранности его содержимого с помощью метода close, применяемого к объекту – файловой переменной. ```py fp.close() ``` ### 4.5. Запись информации в файл с помощью метода write. Метод __write__ относится к объекту – файловой переменной. Пример 1. Создадим список с элементами-числами от 1 до 12 и запишите их в файл по 4 числа на строке: ```py >>> sps=list(range(1,13)) >>> fp2=open('zapis3.txt','w') >>> fp2.write(str(sps[:4])+'\n') 13 >>> fp2.write(str(sps[:4])+'\n') 13 >>> fp2.write(str(sps[8:])+'\n') 16 >>> fp2.close() ``` В файле появилась запись: ```py [1, 2, 3, 4] [1, 2, 3, 4] [9, 10, 11, 12] ``` Пример 2. ```py >>>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) 11 11 12 >>> fp3.close() ``` В файле появилась запись: ![Скриншот файла zapis4](Фото1.png) Попробуем сделать так: ```py >>> gh=open('zapis5.txt','w') >>> for r in sps3: ... gh.write(r[0]+' '+str(r[1])+'\n') 12 12 13 >>> gh.close() ``` Обратите внимание на то, что этот цикл можно представить одной строкой: ```py for r in sps3: gh.write(r[0]+' '+str(r[1])+'\n') ``` ### 4.6. Первый способ чтения информации из текстового файла. Прочитаем информацию из ранее созданного файла zapis3.txt. ```py >>> sps1=[] >>> fp=open('zapis3.txt') >>> for stroka in fp: ... stroka=stroka.rstrip('\n') ... stroka=stroka.replace('[','') ... stroka=stroka.replace(']','') ... sps1=sps1+stroka.split(',') >>> fp.close() >>> print(sps1) ['1', ' 2', ' 3', ' 4', '1', ' 2', ' 3', ' 4', '9', ' 10', ' 11', ' 12'] ``` Обратите внимание, что в функции открытия файла использован только один аргумент, остальные – со значениями «по умолчанию». Здесь, перед занесением строки в список с помощью метода __rstrip__, из неё удаляется символ конца строки, а с помощью метода __replace__ – скобки. __Отличия:__ Данные в sps1 представлены в виде строк, а в zapis3.txt — в виде целых чисел. Подумаем, как сделать так, чтобы список, полученный при чтении из файла, совпал с исходным: ```py >>>sps=[] >>> for i in sps1: ... sps.append(int(i)) >>> sps [1, 2, 3, 4, 1, 2, 3, 4, 9, 10, 11, 12] ``` ### 4.7. Чтение информации из файла с помощью метода read. Метод __read__, как и __write__, относится к объекту – файловой переменной. Метод read() читает данные из файла (текстового или бинарного) и возвращает строку или байтовую последовательность. ```py >>> fp=open('zapis3.txt') >>> stroka1=fp.read(12) >>> stroka2=fp.read() >>> fp.close() >>> stroka1 '[1, 2, 3, 4]' >>> stroka2 '\n[1, 2, 3, 4]\n[9, 10, 11, 12]\n' ``` ### 4.8. Чтение информации с помощью методов readline и readlines. Эти методы позволяют прочитать из файла, начиная с текущего положения маркера, соответствен-но, одну строку символов (совокупность байт) или все строки (все байты). __readline()__ - функция, которая читает одну строку из файла. ```py >>> fp=open('zapis3.txt') >>> s1=fp.readline(); s1 [1, 2, 3, 4] >>> s2 = fp.readline(); s2 '[1, 2, 3, 4]\n' >>> s3=fp.readline();s3 '[9, 10, 11, 12]\n' >>> fp.close() ``` __readlines()__ - функция, которая читает все строки, возвращая их в виде списка ```py >>> fp=open('zapis3.txt') >>> s4=fp.readlines(); s4 ['[1, 2, 3, 4]\n', '[1, 2, 3, 4]\n', '[9, 10, 11, 12]\n'] ``` ### 4.9. Ввод-вывод объектов с использованием функций из модуля pickle. В модуле __pickle__ содержатся функции для работы с бинарными файлами, в которые могут последо-вательно записываться или считываться целиком один или несколько объектов из оперативной памяти. ```py >>> import pickle >>> mnoz1={'pen','book','pen','iPhone','table','book'} >>> fp=open('zapis6.mnz','wb') >>> pickle.dump(mnoz1,fp) >>> fp.close() ``` В файле появилась запись: ![Скриншот файла запись6] (Фото3.png) Теперь прочитаем данные из файла в объект mnoz2: ```py >>> fp=open('zapis6.mnz','rb') >>> mnoz2=pickle.load(fp) >>> fp.close() >>> mnoz2 {'iPhone', 'table', 'pen', 'book'} ``` Инструкцией проверили два объекта: mnoz1 и mnoz2 на совпадение. ```py mnoz1==mnoz2 True ``` Результат отличается от введённого множества mnoz1 потому, что множество автоматически удалило все повторяющиеся слова и могло изменить их порядок А теперь с использованием тех же функций запишите в файл, а затем прочитайте два объекта раз-ных типов: то же множество mnoz1 и ранее созданный список sps3. При считывании объекты из-влекаются из файла в той же последовательности, в которой они в него записывались. ```py >>> 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; mnoz1 {'iPhone', 'table', 'pen', 'book'} {'iPhone', 'table', 'pen', 'book'} >>> obj2; sps3 [['Иванов И.', 1], ['Петров П.', 2], ['Сидоров С.', 3]] [['Иванов И.', 1], ['Петров П.', 2], ['Сидоров С.', 3]] ``` ## Пункт 5. Перенаправление потоков ввода и вывода данных. Проделаем следующие операции: ```py >>>import sys >>>vr_out=sys.stdout #Запоминаем текущий поток вывода >>>fc=open('Stroka.txt','w') #Откроем файл вывода >>>sys.stdout=fc #Перенацеливаем стандартный поток вывода на файл >>>print('запись строки в файл') #Вывод теперь будет не на экран, а в файл >>>sys.stdout=vr_out #Восстановление текущего потока >>>print('запись строки на экран') #Убеждаемся, что вывод на экран восстановился запись строки на экран >>>fc.close() ``` В файле: ![Скриншот файла] (Фото4.png) Точно также можно перенаправить поток ввода – sys.stdin – вместо клавиатуры – из файла. ```py >>> import sys >>> vr_out=sys.stdout #Запоминаем текущий поток вывода >>> fc=open('Stroka.txt','w') #Откроем файл вывода >>> sys.stdout=fc #Перенацеливаем стандартный поток вывода на файл >>> print('запись строки в файл') #Вывод теперь будет не на экран, а в файл >>> sys.stdout=vr_out #Восстановление текущего потока >>> print('запись строки на экран') #Убеждаемся, что вывод на экран восстановился запись строки на экран >>> fc.close() >>> 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: ... line = input () #Считываем из файла строку ... print(line) # Отображаем считанное ... except EOFError: ... break запись строки в файл >>> fd.close() >>> sys.stdin=tmp_in #Не забыть вернуть стандартное назначение для потока ввода ``` ## Пункт 6. Завершение сеанса