diff --git a/TEMA6/report.md b/TEMA6/report.md new file mode 100644 index 0000000..7533e3f --- /dev/null +++ b/TEMA6/report.md @@ -0,0 +1,542 @@ +# Отчёт по Теме 6 + +Кузьменко Елена, А-02-23 + +## 1. Запустили интерактивную оболочку IDLE. + +## 2. Вывод данных на экран дисплея. + +### 2.1. Вывод в командной строке. + +```py +>>> stroka = 'Автоматизированная система управления'; stroka # эхо-вывод +'Автоматизированная система управления' +``` + +### 2.2. Вывод с использованием функции print(). + +Обычный вывод: + +```py +>>> fff = 234.5; gg = 'Значение температуры = ' +>>> print(gg, fff) +Значение температуры = 234.5 +``` + +Помимо пробела разделителем могут служить другие знаки, используя команду sep: + +```py +>>> print(gg, fff, sep='/') +Значение температуры = /234.5 +``` + +Если курсор надо оставить в той же строке(не переходить на след. строку), потребуется использовать ещё один аргумент. Например, с помощью end укажем конец строки(какими символами она должна заканчиваться) или можно указать пустую строку: + +```py +>>> print(gg, fff, sep = '/', end = '***'); print('____') +Значение температуры = /234.5***____ +``` + +С помощью print() можно перейти на новую строку: + +```py +>>> print(gg, fff, sep = '/', end = '***'); print(); print(gg) +Значение температуры = /234.5*** +Значение температуры = +``` + +Оператор вывода на нескольких строках: + +```py +>>> print(""" Здесь может выводиться +большой текст, +занимающий несколько строк""") + Здесь может выводиться +большой текст, +занимающий несколько строк +``` + +Или + +```py +>>> print("Здесь может выводиться", + "большой текст,", + "занимающий несколько строк") +Здесь может выводиться большой текст, занимающий несколько строк +``` + +Тройные кавычки оставляют перенос строки(выводит текст в несколько строк), когда как несколько аргументов print() записываются в одну строку через разделитель. + +### 2.3. Использование метода write объекта sys.stdout. + +Объект stdout представляет собой поток стандартного вывода – объект, в который программы выводят символьное представление данных. + +```py +>>> import sys +>>> sys.stdout.write('Функция write') +Функция write13 +``` + +Метод sys.stdout.write() выводит строку без автоматического перевода на новую строку (в отличие от print()), из чего следует добавить один или несколько символов "\n": + +```py +>>> sys.stdout.write('Функция write\n') +Функция write +14 +``` + +Также можно заметить, что при вызове sys.stdout.write() печатается не только аргумент функции, но и некоторое число, отвечающее за количество успешно записанных символов. + +## 3. Ввод данных с клавиатуры. + +Для ввода используется функция input: + +```py +>>> psw = input('Введите пароль:') +Введите пароль:gugugaga +>>> psw +'gugugaga' +>>> type(psw) + +``` + +#### Пример 1.Ввод и контроль контроль значения в цикле while. + +```py +>>> while True: + znach = float(input('Задайте коэф.усиления = ')) + if znach < 17.5 or znach > 23.8: + print('Ошибка!') + else: + break + + +Задайте коэф.усиления = 10.1 +Ошибка! +Задайте коэф.усиления = 31.0 +Ошибка! +Задайте коэф.усиления = 18.9 +>>> +``` + +#### Пример 2.Ввод и обрабтка выражения eval(). + +```py +>>> import math +>>> print(eval(input('введите выражение для расчета = '))) +введите выражение для расчета = math.log10(23/(1+math.exp(-3.24))) +1.34504378689765 +``` + +## 4.Ввод-вывод при работе с файлами. + +### 4.1.Функция для работы с путём файла. + +Чтобы узнать текущий рабочий каталог используется функция os.getcwd (cwd = current working directory) + +```py +>>> import os +>>> os.getcwd() # пути разделяются двойными обратными слэшами \\ +'C:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python39' +>>> os1 = os.getcwd(); print(os1) # пути разделются \ +C:\Users\Admin\AppData\Local\Programs\Python\Python39 +``` + +Смена рабочего каталога: + +```py +>>> os.chdir('C:\\Users\\Admin\\Desktop\\python-labs\\TEMA6') +>>> os.getcwd() +'C:\\Users\\Admin\\Desktop\\python-labs\\TEMA6' +``` + +#### Самостоятельно: + +os.mkdir() - создание нового каталога: + +```py +>>> os.mkdir('help') +>>> os.chdir('help'); os.getcwd() +'C:\\Users\\Admin\\Desktop\\python-labs\\TEMA6\\help' +``` + +os.listdir() - список каталогов и файлов в текущем рабочем каталоге. + +```py +>>> os.chdir('../'); os.getcwd() +'C:\\Users\\Admin\\Desktop\\python-labs\\TEMA6' +>>> os.listdir() +['.gitkeep', 'help', 'report.md', 'task.md'] +``` + +os.rmdir() - удаление каталога. + +```py +>>> os.rmdir('help'); os.listdir() +['.gitkeep', 'report.md', 'task.md'] +``` + +os.path.isdir() - проверка наличия каталога. + +```py +>>> os.mkdir('test'); os.listdir() +['.gitkeep', 'report.md', 'task.md', 'test'] +>>> os.path.isdir('tast.md') +False # не является каталогом +>>> os.path.isdir('help') +False # отсутствие каталога +>>> os.path.isdir('test') +True +``` + +Путь до файла report.md с помощью функции os.path.abspath(): + +```py +>>> fil = os.path.abspath("report.md"); fil +'C:\\Users\\Admin\\Desktop\\python-labs\\TEMA6\\report.md' +``` + +Пусть в каталоге есть файла oplata.dbf: + +```py +>>> fil = os.path.abspath("oplata.dbf"); fil +'C:\\Users\\Admin\\Desktop\\python-labs\\TEMA6\\oplata.dbf' +``` + +Извлечем путь каталога из "абсолютного" пути с помощью функции os.path.dirname(): + +```py +>>> drkt = os.path.dirname(fil); drkt +'C:\\Users\\Admin\\Desktop\\python-labs\\TEMA6' +``` + +Наоборот, отобразим название файла из абсолютного пути с помощью функции os.path.basename(): + +```py +>>> bsn = os.path.basename(fil); bsn +'oplata.dbf' +``` + +os.path.split() позволяет работать с директорией и именем файла в пути, создавая кортеж: + +```py +>>> os.path.split(fil) +('C:\\Users\\Admin\\Desktop\\python-labs\\TEMA6', 'oplata.dbf') +``` + +Провека наличия файла с известным расположением с помощью функции os.path.isfile(): + +```py +>>> fil +'C:\\Users\\Admin\\Desktop\\python-labs\\TEMA6\\oplata.dbf' +>>> os.path.isfile(fil) +False +``` + +### 4.2. Общая схема работы с файлом. + +Для обмена данными с файлом необходимо выполнить следующие операции: + • Открытие файла с указанием его имени и цели (чтение, запись, добавление данных); + • Выполнение одной или нескольких операций обмена данными с файлом; + • Закрытие файла. + +### 4.3. Функция open() - открытия файла. + +Откроем файл zapis1.txt для записи данных с помощью функции open(): + +```py +>>> fp = open(file = drkt + '\\zapis1.txt', mode= 'w') +>>> fp +<_io.TextIOWrapper name='C:\\Users\\Admin\\Desktop\\python-labs\\TEMA6\\zapis1.txt' mode='w' encoding='cp1251'> +>>> type(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'] +``` + +fp – это файловый объект, который в других языках программирования обычно называют файловой переменной. Он сохраняет ссылку на открываемый файл и позволяет в дальнейшем ссылаться на файл, не указывая путь и имя открытого файла. + +В аргумент mode записывается операция, используемая с файлом: + + 1) r – только чтение (это значение - по умолчанию) + 2) w – запись с созданием нового файла или перезапись существующего файла + 3) a - запись в конец существующего файла или, если его нет, запись с созданием файла, + +Существуют комбинированные операции: + + 1) r+ - чтение и/или запись в существующий файл + 2) w+ - чтение и запись/перезапись файла + 3) a+ - то же, что и в «a», но с возможностью чтения из файла + +Если имя файла на месте первого аргумента, а операция на втором, то можно записывать без имён: + +```py +>>> fp = open('zapis1.txt','w'); fp +<_io.TextIOWrapper name='zapis1.txt' mode='w' encoding='cp1251'> +>>> fp = open(drkt + '\\zapis1.txt', 'w'); fp +<_io.TextIOWrapper name='C:\\Users\\Admin\\Desktop\\python-labs\\TEMA6\\zapis1.txt' mode='w' encoding='cp1251'> +``` + +Файлы могут быть бинарными или символьными. При открытии бинарного файла к аргументу-цели добавляется "b": + +```py +>>> fp1 = open(drkt + '\\zapis2.bin', mode = 'wb+') +``` + +В символьный файл можно записывать только объекты типа str, для других типов обозначается "t". + +### 4.4. Закрытие файла. Метод close(). + +Сохранность файла после завершения работы с ним обеспечивается, например, с помощью метода close(): + +```py +>>> fp.close() +``` + +### 4.5. Запись информации в файл. Метод write(). + +```py +>>> sps = list(range(1,13)) +>>> fp2 = open('zapis3.txt','w') +>>> fp2.write(str(sps[:4])+'\n') +13 # количество записанных символов 12 "[1, 2, 3, 4]" + 1 перенос "\n" +>>> fp2.write(str(sps[4:8])+'\n') +13 +>>> fp2.write(str(sps[8:])+'\n') +16 +>>> fp2.close() +``` + +Содержимое файла zapis3.txt: + +```py +[1, 2, 3, 4] +[5, 6, 7, 8] +[9, 10, 11, 12] +``` + +#### Пример со списком. + +```py +>>> sps3 = [['Иванов И.', 1], ['Петров П.', 2], ['Сидоров С.', 3]]; sps3 +[['Иванов И.', 1], ['Петров П.', 2], ['Сидоров С.', 3]] +``` + +Попытка первая: + +```py +>>> fp3 = open('zapis4.txt', 'w') +for i in range(len(sps3)): + stroka4=sps3[i][0]+' '+str(sps3[i][1]) + fp3.write(stroka4) +>>> for i in range(len(sps3)): + stroka4=sps3[i][0]+' '+str(sps3[i][1]) + fp3.write(stroka4) + + +11 +11 +12 +>>> fp3.close() +``` + +Содержимое файла zapis3.txt: + +```py +Иванов И. 1Петров П. 2Сидоров С. 3 +``` + +Вторая попытка с добавлением переноса строки: + +```py +>>> gh = open('zapis5.txt', 'w') +>>> for r in sps3: + gh.write(r[0]+' '+str(r[1])+'\n') + + +12 +12 +13 +>>> gh.close() +``` + +Содержимое файла zapis5.txt: + +```py +Иванов И. 1 +Петров П. 2 +Сидоров С. 3 +``` + +Запись в одной строке: + +```py +>>> gh1 = open('zapis6.txt','w') +>>> for r in sps3: gh1.write(r[0] + ' ' + str(r[1]) + '\n') + +12 +12 +13 +>>> gh1.close() +``` + +Содержимое файла zapis6.txt: + +```py +Иванов И. 1 +Петров П. 2 +Сидоров С. 3 +``` + +### 4.6. Первый способ чтения информации из текстового файла. + +```py +>>> sps1 = [] +>>> fp = open('zapis3.txt') +>>> for stroka in fp: + stroka=stroka.rstrip('\n') # rstrip() - удаляется символ конца строки + 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'] +>>> sps +[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] +``` + +Список sps1 содержит элементы строкового типа, а в sps целочисленного. Преобразуем: + +```py +>>> sps3 = list(map(int,sps1)); sps3 +[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] +``` + +### 4.7. Чтение информации из файла. Метод read(). + +Содержание файла zapis3.txt: + +```py +[1, 2, 3, 4] +[5, 6, 7, 8] +[9, 10, 11, 12] +``` + +```py +>>> fp = open('zapis3.txt') +>>> stroka1 = fp.read(12) # читает первые 12 элементов, маркер на 13-м +>>> stroka2 = fp.read() # считывает оставшиеся +>>> stroka1; stroka2 +'[1, 2, 3, 4]' +'\n[5, 6, 7, 8]\n[9, 10, 11, 12]\n' +>>> fp.close() +``` + +### 4.8. Методы readline и readlines. + +```py +>>> fp = open('zapis3.txt') +>>> st1 = fp.readline() # прочитает одну строку символов(или совокупность байт для бинарного) +>>> st2 = fp.readlines() # прочитает все строки(все байты) +>>> fp.close() +>>> st1; st2 +'[1, 2, 3, 4]\n' +['[5, 6, 7, 8]\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) #dump – метод записи объекта в файл +>>> fp.close() +``` + +Содержимое файла zapis6.mnz: + + Ђ•# Џ”(Њtable”Њpen”ЊiPhone”Њbook”ђ. + +Прочтение файла выводит такой же результат, какой был при записывании: + +```py +>>> fp = open('zapis6.mnz','rb') +>>> mnoz2 = pickle.load(fp) #load – метод чтения объекта из бинарного файла +>>> fp.close() +>>> mnoz2 +{'table', 'pen', 'iPhone', 'book'} +>>> mnoz1 == mnoz2 +True +``` + +При считываении файла объекты извлекаются в той в же последовательности, в которой были записаны в файл: + +```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) # первое обращение к load читает первый объект +>>> obj2 = pickle.load(fp) # второе – читает второй +>>> fp.close() +>>> obj1; obj2 +{'table', 'pen', 'iPhone', 'book'} +[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] +>>> obj1 == mnoz1; obj2 == sps3 +True +True +``` + +## 5. Перенаправление протоколов вода и вывода данных. + +```py +>>> import sys +>>> vr_out = sys.stdout # запоминаем текущий поток вывода +>>> fc = open('Stroka.txt','w') +>>> sys.stdout = fc # перенаправляем стандартный поток вывода на файл +>>> print('запись строки в файл') # вывод в файл +>>> sys.stdout = vr_out # восстановление текущего потока +>>> print('запись строки на экран') +запись строки на экран +>>> fc.close() +``` + +Содержимое файла Stroka.txt: + + запись строки в файл + +Таким же образом организуем поток ввода: + +```py +>>> 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. + + + + + + + diff --git a/TEMA6/task.md b/TEMA6/task.md new file mode 100644 index 0000000..871ceda --- /dev/null +++ b/TEMA6/task.md @@ -0,0 +1,112 @@ +## Общее контрольное задание по Теме 6 + +Кузьменко Елена, А-02-23 + +## Задание + +Придумайте инструкции и запишите их в файл с расширением .py , которые выполняют следующие операции: + 1) Создаётся объект-кортеж со 125 целыми случайными числами из диапазона от 6 до 56, представленными в виде символьных строк. + 2) Создаётся объект-список с вашей фамилией и 4 фамилиями ваших одноклассников. + 3) Записывается кортеж в бинарный файл. + 4) Записывается в этот же файл список и закрывается файл. + 5) Открывается этот файл для чтения и считывает из него данные в 2 новых объекта. + 6) Проверяется на совпадение новых объектов с исходными и выводится соответствующее сообщение. + 7) Разделяется кортеж на совокупности по 5 чисел в каждой и они записываются в виде отдельных списков со своими именами. + +## Решение + +### 1.Объект-кортеж + +```py +>>> import random +>>> k = [] +>>> for i in range(125): + k.append(str(random.randint(6, 56))) + + +>>> k1 = tuple(k); k1 +('48', '24', '44', '42', '31', '43', '29', '34', '27', '36', '8', '27', '26', '47', '55', '30', '19', '38', '40', '36', '39', '37', '44', '31', '50', '38', '17', '6', '49', '42', '8', '28', '38', '22', '18', '37', '12', '7', '9', '8', '32', '28', '47', '13', '24', '7', '41', '54', '17', '11', '18', '26', '54', '34', '50', '7', '24', '39', '53', '14', '23', '54', '28', '56', '43', '27', '8', '44', '21', '50', '36', '12', '14', '55', '19', '48', '13', '43', '6', '21', '54', '12', '38', '38', '8', '35', '14', '25', '38', '56', '42', '17', '46', '15', '31', '14', '36', '12', '30', '35', '53', '27', '45', '28', '6', '25', '55', '51', '15', '46', '45', '24', '49', '53', '27', '22', '34', '23', '45', '34', '24', '24', '36', '42', '50') +>>> len(k1) +125 +``` + +### 2.Объект-список с фамилиями + +```py +>>> spis = ['Кузьменко','Беженарь','Добровольска','Криви']; spis +['Кузьменко', 'Беженарь', 'Добровольска', 'Криви'] +``` + +### 3-4.Кортеж и список в бинарный файл + +```py +>>> import pickle +>>> fp = open('task1.mnz','wb') +>>> pickle.dump(k1, fp) +>>> pickle.dump(spis, fp) +>>> fp.close() +``` + +Содержимое файла task.mnz: + +Ђ•i (Њ48”Њ24”Њ44”Њ42”Њ31”Њ43”Њ29”Њ34”Њ27”Њ36”Њ8”Њ27”Њ26”Њ47”Њ55”Њ30”Њ19”Њ38”Њ40”Њ36”Њ39”Њ37”Њ44”Њ31”Њ50”Њ38”Њ17”Њ6”Њ49”Њ42”Њ8”Њ28”Њ38”Њ22”Њ18”Њ37”Њ12”Њ7”Њ9”Њ8”Њ32”Њ28”Њ47”Њ13”Њ24”Њ7”Њ41”Њ54”Њ17”Њ11”Њ18”Њ26”Њ54”Њ34”Њ50”Њ7”Њ24”Њ39”Њ53”Њ14”Њ23”Њ54”Њ28”Њ56”Њ43”Њ27”Њ8”Њ44”Њ21”Њ50”Њ36”Њ12”Њ14”Њ55”Њ19”Њ48”Њ13”Њ43”Њ6”Њ21”Њ54”Њ12”Њ38”Њ38”Њ8”Њ35”Њ14”Њ25”Њ38”Њ56”Њ42”Њ17”Њ46”Њ15”Њ31”Њ14”Њ36”Њ12”Њ30”Њ35”Њ53”Њ27”Њ45”Њ28”Њ6”Њ25”Њ55”Њ51”Њ15”Њ46”Њ45”Њ24”Њ49”Њ53”Њ27”Њ22”Њ34”Њ23”Њ45”Њ34”Њ24”Њ24”Њ36”Њ42”Њ50”t”.Ђ•U ]”(ЊКузьменко”ЊБеженарь”ЊДобровольска”Њ +РљСЂРёРІРё”e. + +### 5.Считывание данных в 2 новых объекта + +```py +>>> fp = open('task1.mnz','rb') +>>> k2 = pickle.load(fp) +>>> spis2 = pickle.load(fp) +>>> fp.close() +>>> k2; spis2 +('48', '24', '44', '42', '31', '43', '29', '34', '27', '36', '8', '27', '26', '47', '55', '30', '19', '38', '40', '36', '39', '37', '44', '31', '50', '38', '17', '6', '49', '42', '8', '28', '38', '22', '18', '37', '12', '7', '9', '8', '32', '28', '47', '13', '24', '7', '41', '54', '17', '11', '18', '26', '54', '34', '50', '7', '24', '39', '53', '14', '23', '54', '28', '56', '43', '27', '8', '44', '21', '50', '36', '12', '14', '55', '19', '48', '13', '43', '6', '21', '54', '12', '38', '38', '8', '35', '14', '25', '38', '56', '42', '17', '46', '15', '31', '14', '36', '12', '30', '35', '53', '27', '45', '28', '6', '25', '55', '51', '15', '46', '45', '24', '49', '53', '27', '22', '34', '23', '45', '34', '24', '24', '36', '42', '50') +['Кузьменко', 'Беженарь', 'Добровольска', 'Криви'] +``` + +### 6.Проверка на совпадение + +```py +>>> print('Кортежи совпадают') if k1 == k2 else print('Кортежи не совпадают') +Кортежи совпадают +>>> print('Списки совпадают') if spis == spis2 else print('Списки не совпадают') +Списки совпадают +``` + +### 7.Кортеж на совокупности + +```py +>>> for i in range(0, len(k1), 5): # 0, 5, 10, ... , 120 + exec(f'spis{i//5} = list(k1[i:i + 5])') # индексы 0,1, ..., 24 и срез 5 эл-в: 0-4, 5-9,... + + +>>> for i in range(len(k1) // 5): # 25 + exec(f'print("spis" + str(i) + ":", spis{i})') + + +spis0: ['48', '24', '44', '42', '31'] +spis1: ['43', '29', '34', '27', '36'] +spis2: ['8', '27', '26', '47', '55'] +spis3: ['30', '19', '38', '40', '36'] +spis4: ['39', '37', '44', '31', '50'] +spis5: ['38', '17', '6', '49', '42'] +spis6: ['8', '28', '38', '22', '18'] +spis7: ['37', '12', '7', '9', '8'] +spis8: ['32', '28', '47', '13', '24'] +spis9: ['7', '41', '54', '17', '11'] +spis10: ['18', '26', '54', '34', '50'] +spis11: ['7', '24', '39', '53', '14'] +spis12: ['23', '54', '28', '56', '43'] +spis13: ['27', '8', '44', '21', '50'] +spis14: ['36', '12', '14', '55', '19'] +spis15: ['48', '13', '43', '6', '21'] +spis16: ['54', '12', '38', '38', '8'] +spis17: ['35', '14', '25', '38', '56'] +spis18: ['42', '17', '46', '15', '31'] +spis19: ['14', '36', '12', '30', '35'] +spis20: ['53', '27', '45', '28', '6'] +spis21: ['25', '55', '51', '15', '46'] +spis22: ['45', '24', '49', '53', '27'] +spis23: ['22', '34', '23', '45', '34'] +spis24: ['24', '24', '36', '42', '50'] +``` \ No newline at end of file