*Жалнин Вадим А-01-23* ## 1. Запуск интерактивной оболочки IDLE. ## 2. Вывод данных на экран дисплея. ### 2.1. Вывод в командной строке. ```python >>>stroka='Автоматизированная система управления' >>>stroka 'Автоматизированная система управления' ``` Этот способ называется «эхо-выводом». Пригоден при работе в командной строке, однако в пользовательских функциях этот способ применять нельзя. ### 2.2. Вывод с использованием функции print. ```python >>>fff = 234.5; gg = 'Значение температуры=' >>>print(gg, fff) # Можно вывести несколько объектов за одно обращение к функции Значение температуры= 234.5 >>>print(gg, fff, sep='/') # Указание разделителя с помощью sep Значение температуры=/234.5 >>>print(gg, fff,sep='/',end='***'); print('____') Значение температуры=/234.5***____ ``` Для простого перехода на новую строку, можно использовать такое обращение: ```python >>>print() ``` Оператор вывода может располагаться на нескольких строках с использованием тройных кавычек: ```python >>>print(""" Здесь может выводиться большой текст, занимающий несколько строк""") Здесь может выводиться большой текст, занимающий несколько строк ``` Или: ```python >>>print("Здесь может выводиться", "большой текст,", "занимающий несколько строк") Здесь может выводиться большой текст, занимающий несколько строк ``` В первом случае тройные кавычки воспроизводят текст ровно так, как он был введен. Во втором случае три выводимых объекта-строки перечислены через запятую и выведены как три объекта, разделённые пробелом. ### 2.3. Вывод с использованием метода write объекта sys.stdout. Объект stdout представляет собой поток стандартного вывода – объект, в который программы выводят символьное представление данных. ```python >>>import sys >>>sys.stdout.write('Функция write') Функция write13 ``` Этот метод после вывода строки не осуществляет переход на новую строку. Если это требуется, то следует в конце строки добавить один или несколько символов “\n”: ```python >>>sys.stdout.write('Функция write\n') Функция write 14 ``` Эта функция возвращает число - количество введенных символов (\n считается за один символ) ## 3. Ввод данных с клавиатуры. Используем стандартную функцию input: ```python >>>psw = input('Введите пароль:') Введите пароль:123rkn567 >>>psw '123rkn567' >>>type(psw) ``` input() всегда возвращает строку. Если нужна не строка, то input надо поместить внутрь функции, изменяющей тип данных. Например, int(input()). - Пример 1 Пусть вводится число, которое должно находиться в интервале значений от 17.5 до 23.8 ```python >>>while True: znach=float(input('Задайте коэф.усиления = ')) if znach<17.5 or znach>23.8: print('Ошибка!') else: break Задайте коэф.усиления = 15.4 Ошибка! Задайте коэф.усиления = 21.6 ``` - Пример 2: Ввод и обработка выражения, подлежащего расчету ```python >>>import math >>>print(eval(input('введите выражение для расчета = '))) введите выражение для расчета = math.log10(23/(1+math.exp(-3.24))) 1.34504378689765 ``` Введенная строка преобразуется в исполнительные инструкции с помощью eval(), далее они выполняются и результат выводится на экран. ## 4. Ввод-вывод при работе с файлами. ### 4.1. Функции для работы с путем к файлу. Эти функции собраны в модуле os. Текущий рабочий каталог можно узнать с помощью функции os.getcwd: ```python >>>import os >>>os.getcwd() 'C:\\Users\\twoth\\AppData\\Local\\Programs\\Python\\Python313' >>>Zhalnin = os.getcwd() >>>Zhalnin # Получаем двойные бэкслэши 'C:\\Users\\twoth\\AppData\\Local\\Programs\\Python\\Python313' >>>print(Zhalnin) # Получаем одинарные бэкслэши C:\Users\twoth\AppData\Local\Programs\Python\Python313 >>>os.chdir("C:\\Users\\twoth\\Desktop\\python-labs\\TEMA6") # Смена директории >>>os.getcwd() 'C:\\Users\\twoth\\Desktop\\python-labs\\TEMA6' ``` - Создание каталога (mkdir) ```python >>>help(os.mkdir) Help on built-in function mkdir in module nt: 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. >>>os.chdir("C:\\test") >>>os.mkdir("testdir") >>>os.chdir("C:\\test\\testdir") >>>os.getcwd() 'C:\\test\\testdir' ``` Создаем каталог, затем опускаемся на уровень ниже, чтобы проверить, что каталог создан. - Удаление каталога (rmdir) Для удаления каталога необходимо подняться на уровень выше. ```python >>>os.chdir('../') >>>os.getcwd() 'C:\\test' >>>os.rmdir("testdir") >>>os.rmdir("testdir") # Проверка, что директория удалена Traceback (most recent call last): File "", line 1, in os.rmdir("testdir") FileNotFoundError: [WinError 2] Не удается найти указанный файл: 'testdir' ``` - Показать список всех файлов и папок, вложенных в текущую директорию (listdir) ```python >>>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. >>>os.chdir("C:\\Users\\twoth\\Desktop\\python-labs\\TEMA6") >>>os.listdir() ['.gitkeep'] ``` - Проверка существования каталога (os.path.isdir) ```python >>>help(os.path.isdir) Help on function isdir in module genericpath: isdir(s) Return true if the pathname refers to an existing directory. >>>os.chdir("C:\\Users\\twoth\\Desktop\\python-labs") >>>os.getcwd() 'C:\\Users\\twoth\\Desktop\\python-labs' >>>os.path.isdir("TEMA6") True >>>os.path.isdir("TEMA10") False ``` - Получение символьной строки, содержащей имя файла вместе с полным путем доступа к нему с помощью функции os.path.abspath: ```python >>>fil=os.path.abspath("oplata.dbf") >>>fil 'С:\\test\\oplata.dbf' >>>fil=os.path.abspath("test.txt") >>>fil 'С:\\test\\test.txt' ``` - Отделение из абсолютного пути только каталога/только имени файла. ```python >>>drkt = os.path.dirname(fil) >>>print(drkt) С:\test >>>bsnm = os.path.basename(fil) >>>print(bsnm) test.txt ``` Функция os.path.dirname() из абсолютного пути выделяется путь доступа (от диска до последней папки). Функция os.path.basename(), наоборот, убирает из абсолютного пути все, кроме имени файла. - Разделение на кортеж из пути и из имени файла. ```python >>>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) ('С:\\test', 'test.txt') >>>type(os.path.split(fil)) ``` - Проверка существования пути, заданного в символьной строке (os.path.exists). ```python >>>os.path.exists("С:\oldest") # Такой каталог есть True >>>os.path.exists("С:\bsod") True >>>os.path.exists("С:\lab1") # Такого каталога нету False ``` - Проверка существования файла. ```python >>>os.path.isfile(fil) True >>>os.path.isfile(os.path.dirname(fil)+'fil1.txt') False ``` Первая строка работает корректно - проверяет существование файла fil. Вторая строка содержит ошибку - неправильное объединение путей приводит к несуществующему пути. ### 4.2. Общая схема работы с файлом Для обмена данными с файлом необходимо выполнить следующие операции: - Открытие файла с указанием его имени и цели (чтение, запись, добавление данных); - Выполнение одной или нескольких операций обмена данными с файлом; - Закрытие файла. ### 4.3. Открытие файла для записи или чтения данных – функция open. ```python >>>fp = open(file = drkt+'\\zapis1.txt', mode = 'w') >>>type(fp) >>>fp <_io.TextIOWrapper name='C:\\test\\zapis1.txt' mode='w' encoding='cp1251'> ``` Здесь fp – это файловый объект, который в других языках программирования обычно называют файловой переменной. Он сохраняет ссылку на открываемый файл и позволяет в дальнейшем ссылаться на файл, не указывая путь и имя открытого файла. В аргументе функции с именем file указывается путь и имя открываемого файла, а в аргументе с именем mode – предполагаемая цель его использования (w=write – для записи). Аргументы функции с их именами могут располагаться в любом порядке. Если имя файла располагается на месте первого аргумента, а цель использования – на втором, то имена аргументов можно не указывать и просто вводить: ```python >>>fp = open(drkt+'\\zapis1.txt', 'w') >>>fp <_io.TextIOWrapper name='C:\\test\\zapis1.txt' mode='w' encoding='cp1251'> ``` Если путь в переменной drkt совпадает с рабочим каталогом, то его можно опустить, оставив только имя открываемого файла: ```python >>>fp = open('zapis1.txt', 'w') >>>fp <_io.TextIOWrapper name='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'] ``` Если требуются другие операции с открываемым файлом, то для второго аргумента «mode=…» могут быть заданы следующие значения: w – запись с созданием нового файла или перезапись существующего файла, w+ - чтение и запись/перезапись файла, r – только чтение (это значение - по умолчанию), r+ - чтение и/или запись в существующий файл, a – запись в конец существующего файла или, если его нет, запись с созданием файла, a+ - то же, что и в «a», но с возможностью чтения из файла. В зависимости от значения этого аргумента тип создаваемой файловой переменной может быть разным. При открытии бинарного файла к указанным выше буквам надо добавить символ «b» Пример открытия бинарного файла: ```python >>>fp1 = open(drkt+'\\zapis2.bin', mode = 'wb+') >>>fp1 <_io.BufferedRandom name='C:\\test\\zapis2.bin'> ``` ### 4.4. Закрытие файла. ```python >>>fp.close() >>>fp <_io.TextIOWrapper name='zapis1.txt' mode='w' encoding='cp1251'> ``` После закрытия на объект все еще можно посмотреть. ### 4.5. Запись информации в файл с помощью метода write. Метод write относится к объекту – файловой переменной. Создание списка с элементами-числами от 1 до 12 и запись их в файл по 4 числа на строке: ```python >>>sps = list(range(1, 13)) >>>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] Создание списка с элементами-списками: ```python >>>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) 11 11 12 >>>fp3.close() ``` Файл в текстовом редакторе: Иванов И. 1Петров П. 2Сидоров С. 3 - Видно, что вывод в файл получился некачественный Попробуем изменить код: ```python >>>gh=open('zapis5.txt','w') >>>for r in sps3: gh.write(r[0] + ' '+str(r[1]) + '\n') 12 12 13 for r in sps3: gh.write(r[0]+' '+str(r[1])+'\n') 12 12 13 gh.close() ``` Добавился перенос на следующую строку на каждой итерации цикла и пробел в нужном месте. Результат: Иванов И. 1 Петров П. 2 Сидоров С. 3 ### 4.6. Первый способ чтения информации из текстового файла. ```python >>>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', '5', ' 6', ' 7', ' 8', '9', ' 10', ' 11', ' 12'] ``` Здесь, перед занесением строки в список с помощью метода rstrip, из неё удаляется символ конца строки, а с помощью метода replace – скобки. Заметно, что полученный список отличается от исходного sps типом данных. В sps1 заметна некорректность работы программы(остались лишние пробелы). Способ преобразования sps1 в sps: ```python >>>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. Метод read, как и write, относится к объекту – файловой переменной. В качестве аргумента этого метода может задаваться целое число – количество символов или, если открыт бинарный файл, - количество байт, которое должно быть прочитано, соответственно, из текстового или бинарного файла, начиная с текущего положения маркера. Если указанное число превышает количество оставшихся символов (байт) в файле, то считываются все оставшиеся символы (байты). Если это число не указано, то считываются вся информация от маркера до конца файла. Метод возвращает строку с символами или совокупность байт, прочитанных из файла. ```python >>>fp = open('zapis3.txt') >>>stroka1 = fp.read(12) # Чтение первых 12 символов(байт), курсор остановится на 13-ом (/n) >>>stroka2 = fp.read() # Чтение всех оставшихся символов вплоть до EOF >>>fp.close() >>>print(stroka1) [1, 2, 3, 4] >>>print(stroka2) [5, 6, 7, 8] [9, 10, 11, 12] ``` ### 4.8. Чтение информации с помощью методов readline и readlines. Эти методы позволяют прочитать из файла, начиная с текущего положения маркера, соответственно, одну строку символов (совокупность байт) или все строки (все байты). ```python >>>file = open("zapis5.txt") >>>file.readline() 'Иванов И. 1\n' >>>file.close() >>>file = open("zapis5.txt") >>>file.readlines() ['Иванов И. 1\n', 'Петров П. 2\n', 'Сидоров С. 3\n'] ``` ### 4.9. Ввод-вывод объектов с использованием функций из модуля pickle. ```python >>>import pickle >>>mnoz1={'pen','book','pen','iPhone','table','book'} #Объект типа «множество» >>>fp=open('zapis6.mnz','wb') # Бинарный файл – на запись >>>pickle.dump(mnoz1,fp) #dump – метод записи объекта в файл >>>fp.close() ``` Запись, произведенная в файл: 耄锣 鐨谅瑡扬斔谄扯潫钌٩偨潮斔调灥溔逮 Байты в этом файле не предназначены для текстового представления. Они могут содержать символы, которые не могут быть корректно интерпретированы в рамках текстовой кодировки. Теперь прочитаем данные из файла в объект mnoz2: ```python >>>fp=open('zapis6.mnz','rb') >>>mnoz2=pickle.load(fp) #load – метод чтения объекта из бинарного файла >>>fp.close() >>>print(mnoz2) {'table', 'book', 'iPhone', 'pen'} >>>print(mnoz1) {'table', 'book', 'iPhone', 'pen'} >>>mnoz1 == mnoz2 True ``` mnoz1 не совпадает с изначально заданным mnoz1, потому что данный тип объекта исключает повторяющиеся элементы. С использованием тех же функций запишем в файл, а затем прочитаем два объекта разных типов: то же множество mnoz1 и ранее созданный список sps3. При считывании объекты извлекаются из файла в той же последовательности, в которой они в него записывались. ```python >>>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() >>>print(obj1) {'table', 'book', 'iPhone', 'pen'} >>>print(obj2) [['Иванов И.', 1], ['Петров П.', 2], ['Сидоров С.', 3]] >>>mnoz1 == obj1 True >>>sps3 == obj2 True ``` ## 5. Перенаправление потоков ввода и вывода данных. sys.stdin — поток ввода sys.stdout — поток вывода sys.stderr — поток ошибок ```python >>>import sys >>>vr_out = sys.stdout #Запоминаем текущий поток вывода >>>fc = open('Stroka.txt', 'w') #Откроем файл вывода >>>sys.stdout = fc #Перенацеливаем стандартный поток вывода на файл >>>print('запись строки в файл') #Вывод теперь будет не на экран, а в файл >>>sys.stdout=vr_out #Восстановление текущего потока >>>print('запись строки на экран') #Убеждаемся, что вывод на экран восстановился запись строки на экран >>>fc.close ``` В файле Stroka.txt находится: запись строки в файл Точно также можно перенаправить поток ввода – sys.stdin – вместо клавиатуры – из файла. ```python >>> 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 #Возвращение стандартного назначения для потока ввода ``` Ошибка "EOFError: EOF when reading a line" возникает, когда программа ожидает чтения строки из входного потока, но вместо этого достигает конца файла (EOF), что означает, что необходимые данные отсутствуют. ## 6. Завершение сеанса в среде IDLE