diff --git a/TEMA6/photo6.png b/TEMA6/photo6.png new file mode 100644 index 0000000..04e70b1 Binary files /dev/null and b/TEMA6/photo6.png differ diff --git a/TEMA6/report.md b/TEMA6/report.md new file mode 100644 index 0000000..39b23dc --- /dev/null +++ b/TEMA6/report.md @@ -0,0 +1,461 @@ +# Отчёт по Теме 6 +Ходюк Максим Романович А-01-23 +## Пункт 1 +Запустил стреду IDLE и выставил рабочий каталог: +``` +import os +os.chdir('D:\\POAS\\Hodyuk\\Tema6\\') +``` + +## Пункт 2 +### 2.1. Вывод в командной строке +``` +stroka='Автоматизированная система управления' +stroka +'Автоматизированная система управления' +``` +Данный способ вывода называется Эхо-выводом + +### 2.2 Функция print +Пример использования +``` +fff=234.5;gg='Значение температуры = ' +print(gg, fff) +Значение температуры = 234.5 +``` + +Можно изменить разделитель при выводе аргументом sep и символы, оканчивающие вывод с помощью аргумента end +``` +print(gg, fff, sep='/') +Значение температуры = /234.5 +print(gg, fff,sep='/',end='***'); print('____') +Значение температуры = /234.5***____ +print() +``` + +Оператор вывода может располагаться на нескольких строках: +``` +print(""" Здесь может выводиться +большой текст, +занимающий несколько строк""") + + Здесь может выводиться +большой текст, +занимающий несколько строк +print("Здесь может выводиться", + "большой текст,", + "занимающий несколько строк") +Здесь может выводиться большой текст, занимающий несколько строк +``` + +### 2.3 Функция write +Импортирую модуль sys и применяю функцию write +``` +import sys +sys.stdout.write('Функция write') +Функция write13 +sys.stdout.write('Функция write\n') +Функция write +14 +``` + +## Пункт 3. Функция input (ввод с клавиатуры) + +``` +psw=input('Введите пароль:') +Введите пароль: 12345 +psw +' 12345' +``` + +Пример 1. Ввод с контролем значения +``` +while True: + znach=float(input('Задайте коэф.усиления = ')) + if znach<17.5 or znach>23.8: + print('Ошибка!') + else: + break + +Задайте коэф.усиления = 20 +while True: + znach=float(input('Задайте коэф.усиления = ')) + if znach<17.5 or znach>23.8: + print('Ошибка!') + else: + break + + +Задайте коэф.усиления = 3 +Ошибка! +Задайте коэф.усиления = 5 +Ошибка! +Задайте коэф.усиления = 19 +``` + +Пример 2. Ввод и обработка выражения +``` +import math +print(eval(input('введите выражение для расчета = '))) +введите выражение для расчета = math.log10(23/(1+math.exp(-3.24))) +1.34504378689765 +``` + +## Пункт 4. +### 4.1 Функции для работы с путём к файлу + +Модуль os был импортирован ранее, а также выставлен рабочий каталог, поэтому сразу перейду к использованию других функций в этом модуле +Использование функции для создания и удаления каталога: +``` +os.mkdir('gg') +``` +На рис.1 представлен скриншот созданного каталога gg +![Рис 1.](photo1.png) + +``` +os.rmdir('gg') +``` + +На рис. 2 представлен скриншот после выполнения функций удаления каталога +![Рис 2.](photo2.png) + +Использовал функцию для выводе всех файлов, находящихся в выбранном каталоге(при пустых аргументах выдаёт содержимое рабочего каталога) +``` +os.listdir() +['photo1.png', 'photo2.png', 'report.md'] +``` + +Использования функции isdir из модуля os.path (для проверки наличия подкаталога в каталоге) +``` +help(os.path.isdir) +Help on built-in function _path_isdir in module nt: + +_path_isdir(s) + Return true if the pathname refers to an existing directory. + +os.mkdir('test_isdir') +os.path.isdir('test_isdir') +True +``` + +Пусть в рабочем каталоге находится файл OPLATA.DBF. С помощью функции os.path.abspath можно получить символьную строку, содержащую имя файла вместе с полным путем доступа к нему: + +``` +fil=os.path.abspath("oplata.dbf") +fil +'D:\\POAS\\Hodyuk\\Tema6\\oplata.dbf' + +fil=os.path.abspath("photo1.png") +fil +'D:\\POAS\\Hodyuk\\Tema6\\photo1.png' +``` + +Выделил путь доступа к файлу из строки с помощью следующей функции: +``` +drkt=os.path.dirname(fil) +drkt +'D:\\POAS\\Hodyuk\\Tema6' +``` +Далее выделил имя файла из этой строки +``` +bn=os.path.basename(fil) +bn +'photo1.png' +``` + +Самостоятельно применил функцию os.path.split +``` +help(os.path.split) +Help on function split in module ntpath: + +split(p) + Split a pathname. + + Return tuple (head, tail) where tail is everything after the final slash. + Either part may be empty. + +os.path.split(fil) +('D:\\POAS\\Hodyuk\\Tema6', 'photo1.png') +``` +Функция возвращает кортёж из пути доступа к файлу и его имени, отделив их друг от друга + +С помощью функции os.path.exists можно проверить существует ли путь, заданный в символьной строке – аргументе функции. +``` +os.path.exists(drkt) +True +os.path.exists('D:test\\wrong\\way\\') +False +``` + +Проверил наличие файла с известным расположением(если как аргумент задать только имя файла, функция будет искать файл в рабочем каталоге) +``` +os.path.isfile(fil) +True +os.path.isfile(os.path.dirname(fil)+'fil1.txt') +False +``` + +### 4.2 Общая схема работы с файлом +Для обмена данными с файлом необходимо выполнить следующие операции: + +• Открытие файла с указанием его имени и цели (чтение, запись, добавление данных); + +• Выполнение одной или нескольких операций обмена данными с файлом; + +• Закрытие файла. + +### 4.3 Открытие файла для записи или чтения - функция open +Открыл файл zapis1.txt для записи данных +``` +fp=open(file=drkt+'\\zapis1.txt',mode='w') +``` +Проверил наличие открываемого файла: +``` +os.path.isfile(drkt+'\\zapis1.txt') +True +``` +Вообще говоря, аргументы функции с их именами могут располагаться в любом порядке. Если имя файла располагается на месте первого аргумента, а цель использования – на втором, то имена аргументов можно не указывать и просто вводить +``` +fp=open(drkt+'\\zapis1.txt','w') +``` +С помощью функции closed проверил, открыт ли файл(соответственно, если функция возвращает True - файл закрыт, а если False - то открыт). Далее буду использовать этот способ для проверки открытия файла + +``` +fp.closed +False +``` +Если путь в переменной drkt совпадает с рабочим каталогом, то его можно опустить, оставив только имя открываемого файла: +``` +fp=open('zapis1.txt','w') +fp.closed +False +``` +Отобразил тип и список атрибутов объекта fp +``` +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'] +``` + +Создаваемые и читаемые файлы могут быть бинарными или символьными. При открытии бинарного файла к указанным выше буквам в аргументе-цели надо добавить символ «b». +``` +fp1=open(drkt+'\\zapis2.bin',mode='wb+') +fp1.closed +False +``` + +### 4.4 Закрытие файла +``` +fp.close() +fp.closed +True +``` + +### 4.5 Запись в файл с помощью функции write +Рассмотрел пример создания списка и записи его в файл +``` +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() +``` +Содержимое файла [zapis3.txt](zapis3.txt) представлено на рис.3 +![Рис.3](photo3.png) + +Следующий пример + +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.txt](zapis4.txt) представлено на рис.4 +![Рис.4](photo4.png) + +Легко заметить, что информация записана в файл не очень удачно. + +Пробую записать информацию в файл другим способом +``` +gh=open('zapis5.txt','w') +for r in sps3: + gh.write(r[0]+' '+str(r[1])+'\n') + +12 +12 +13 +gh.close() +``` + +Содержимое файла [zapis5.txt](zapis5.txt) представлено на рис.5 +![Рис.5](photo5.png) + +Представил цикл в одной строке: +``` +gh=open('zapis5.txt','w') +for r in sps3: gh.write(r[0]+' '+str(r[1])+'\n') + +12 +12 +13 +gh.close() +``` +После выполнения цикла содержимое файла такое же, как было + + +### 4.6 Чтений информации из текстового файла: Способ Первый + +Прочитал информацию из созданного ранее файла zapis3.txt +``` +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() +sps1 +['1', ' 2', ' 3', ' 4', '5', ' 6', ' 7', ' 8', '9', ' 10', ' 11', ' 12'] +``` +Здесь, перед занесением строки в список с помощью метода rstrip, из неё удаляется символ конца строки, а с помощью метода replace – скобки. +Видно, что полученный список отличается от исходного sps, в первую очередь, типом данных +Преобразовать sps1 в sps можно, например, так: +``` +sps2 = [int(i.strip()) for i in sps1] +sps2 +[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] +``` + +### 4.7 Чтение с помощью метода read + +``` +fp=open('zapis3.txt') +stroka1=fp.read(12) +stroka2=fp.read() +fp.close() +stroka1 +'[1, 2, 3, 4]' +stroka2 +'\n[5, 6, 7, 8]\n[9, 10, 11, 12]\n' +``` + +### 4.8 Самостоятельно изучил чтение информации с помощью методов readline и readlines +``` +fp=open('zapis3.txt') +stroka3=fp.readline() +stroka3 +'[1, 2, 3, 4]\n' +stroka4=fp.readline() +stroka4 +'[5, 6, 7, 8]\n' +strokaAll=fp.readlines() +strokaAll +['[9, 10, 11, 12]\n'] +fp.close() +fp=open('zapis3.txt') +strokaAll=fp.readlines() +strokaAll +['[1, 2, 3, 4]\n', '[5, 6, 7, 8]\n', '[9, 10, 11, 12]\n'] +``` + +### 4.9 Ввод-вывод с помощью модуля pickle +Пример этого способа работы с файлами +``` +import pickle +mnoz1={'pen','book','pen','iPhone','table','book'} +fp=open('zapis6.mnz','wb') +fp.closed +False +pickle.dump(mnoz1,fp) +fp.close() +``` + +Теперь прочитаю из файла zapis6.mnz +``` +fp=open('zapis6.mnz','rb') +mnoz2=pickle.load(fp) +fp.close() +mnoz2 +{'book', 'pen', 'table', 'iPhone'} +mnoz1 == mnoz2 +True +``` +Как можно заметить, визуально файлы отличаются, но проверка на совпадение выдаёт результат True +mnoz2 не совпадает с тем, что было задано, потому что это множество. Оно исключает повторяющиеся элементы, оставляя только один, а еще не содержит конкретный порядок элементов. Но два множества равны, если у них равны все элементы и их одинаковое количество, вне зависимости от порядка, так что сравнение возвращает True. + +А теперь с использованием тех же функций запишите в файл, а затем прочитайте два объекта разных типов: то же множество mnoz1 и ранее созданный список sps3. +``` +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,obj2 +({'book', 'pen', 'table', 'iPhone'}, [['Иванов И.', 1], ['Петров П.', 2], ['Сидоров С.', 3]]) +obj1 == mnoz1 +True +obj2 == sps3 +True +``` +Убедился в совпадении прочитанных данных с введёнными + + +## Пункт 5. Перенаправление потоков ввода и вывода +Пример 1 +``` +vr_out=sys.stdoutmnoz1 +fc=open('Stroka.txt','w') +sys.stdout=fc +print('запись строки в файл') +sys.stdout=vr_out +print('запись строки на экран') +запись строки на экран +fc.close() +``` +В результате получаю файл [Stroka.txt](Stroka.txt) со следующим содержанием +![Рис.6](photo6.png) + +Точно также можно перенаправить поток ввода – sys.stdin – вместо клавиатуры – из файла. + +``` +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 +Закончил сеанс работы с IDLE +