Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

24 KiB

Отчет по теме 6

Мельников Дмитрий, А-01-23

1. Запуск интерактивной оболочки IDLE.

2. Вывод данных на экран дисплея.

2.1. Вывод в командной строке.

>>>stroka='Автоматизированная система управления'
>>>stroka
'Автоматизированная система управления'

Этот способ называется «эхо-выводом». Он пригоден при работе в командной строке, однако в пользовательских функциях, которые будут изучаться дальше, этот способ применять нельзя!

2.2. Вывод с использованием функции print.

Вывод объектов на экран:

>>>fff = 234.5; gg = 'Значение температуры='
>>>print(gg, fff)  # Можно вывести несколько объектов за одно обращение к функции
Значение температуры= 234.5
>>>print(gg, fff, sep='/') # Указание разделителя с помощью sep
Значение температуры=/234.5
>>>print(gg, fff,sep='/',end='***'); print('____')
Значение температуры=/234.5***____

Для простого перехода на новую строку, можно использовать такое обращение:

>>>print()

Для большого текста оператор вывода может располагаться на нескольких строках с использованием тройных кавычек:

>>>print(""" Здесь может выводиться
большой текст,
занимающий несколько строк""")
 Здесь может выводиться
большой текст,
занимающий несколько строк

Или:

>>>print("Здесь может выводиться",
     "большой текст,",
     "занимающий несколько строк")
Здесь может выводиться большой текст, занимающий несколько строк

Разница воспроизведения текста на экран видна. В первом случае текст воспринимается как один объект, поэтому имеем соответствующий вывод. Во втором случае наблюдаем работу обычного вывода print() с разделением объектов через пробелы.

2.3. Вывод с использованием метода write объекта sys.stdout.

>>>sys.stdout.write('Функция write')
Функция write13

Обратим внимание, что этот метод после вывода строки не осуществляет переход на новую строку. Если это требуется, то следует в конце строки добавить один или несколько символов “\n”:

>>>sys.stdout.write('Функция write\n')
Функция write
14

Как видим, в этом методе, в обоих случаях, выводится количество введенных символов. В этом контексте 14 — это не результат вычисления, а возвращаемое значение функции write в интерактивной консоли, показывающее, сколько символов она успешно вывела.

3. Ввод данных с клавиатуры.

>>>psw = input('Введите пароль:')
Введите пароль:123rkn567
>>>psw
'123rkn567'
>>>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(), которая вычисляет выражение, записанное в этой строке, как код Python. Результат вычисления (возвращаемое значение eval()) передается в функцию print(), которая выводит его на экран.

4. Ввод-вывод при работе с файлами.

4.1. Функции для работы с путем к файлу.

>>>import os
>>>os.getcwd()
'C:\\Users\\dimoo\\AppData\\Local\\Programs\\Python\\Python310'
>>>Melnikov = os.getcwd()
>>>Melnikov # Получаем двойные бэкслэши 
'C:\\Users\\dimoo\\AppData\\Local\\Programs\\Python\\Python310'
>>>print(Melnikov) # Получаем одинарные бэкслэши
C:\Users\dimoo\AppData\Local\Programs\Python\Python310
>>>os.chdir("C:\\Users\\dimoo\\OneDrive\\Рабочий стол\\lab01\\python-labs\\TEMA6") # Смена директории
>>>os.getcwd()
'C:\\Users\\dimoo\\OneDrive\\Рабочий стол\\lab01\\python-labs\\TEMA6'
  • Создание каталога (mkdir)
>>>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("D:\\test")
>>>os.mkdir("testdir")
>>>os.chdir("D:\\test\\testdir")
>>>os.getcwd()
'D:\\test\\testdir'

Создаем каталог, затем опускаемся на уровень ниже, чтобы проверить, что каталог создан.

  • Удаление каталога (rmdir) Для удаления каталога необходимо подняться на уровень выше.
>>>os.chdir('../')
>>>os.getcwd()
'D:\\test'
>>>os.rmdir("testdir")
>>>os.rmdir("testdir") # Проверка, что директория удалена
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    os.rmdir("testdir")
FileNotFoundError: [WinError 2] Не удается найти указанный файл: 'testdir'
  • Показать список всех файлов и папок, вложенных в текущую директорию (listdir)
>>>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\\dimoo\\OneDrive\\Рабочий стол\\lab01\\python-labs\\TEMA6")
>>>os.listdir()
['.gitkeep', 'desktop.ini', 'report.md', 'testdir']
  • Проверка существования каталога (os.path.isdir)
>>>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\\dimoo\\OneDrive\\Рабочий стол\\lab01\\python-labs\\TEMA6")
>>>os.getcwd()
'C:\\Users\\dimoo\\OneDrive\\Рабочий стол\\lab01\\python-labs\\TEMA6'
>>>os.path.isdir("testdir")
True
>>>os.path.isdir("netestdir")
False
  • Получение символьной строки, содержащей имя файла вместе с полным путем доступа к нему с помощью функции os.path.abspath:
>>>fil=os.path.abspath("oplata.dbf")
>>>fil
'D:\\test\\oplata.dbf'
>>>fil=os.path.abspath("test.txt")
>>>fil
'D:\\test\\test.txt'
  • Отделение из абсолютного пути только каталога/только имени файла.
>>>drkt = os.path.dirname(fil)
>>>print(drkt)
D:\test
>>>bsnm = os.path.basename(fil)
>>>print(bsnm)
test.txt

Функция os.path.dirname() из абсолютного пути выделяется путь доступа (от диска до последней папки). Функция os.path.basename(), наоборот, убирает из абсолютного пути все, кроме имени файла.

  • Разделение на кортеж из пути и из имени файла.
>>>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:\\test', 'test.txt')
>>>type(os.path.split(fil))
<class 'tuple'>
  • Проверка существования пути, заданного в символьной строке (os.path.exists).
>>>os.path.exists("D:\Proga") # Такой каталг есть
True
>>>os.path.exists("D:\lab01")
True
>>>os.path.exists("D:\lab1") # Такого каталога нету
False
  • Проверка существования файла.
>>>os.path.isfile(fil)
True
>>>os.path.isfile(os.path.dirname(fil)+'fil1.txt')
False

Первая строка работает корректно - проверяет существование файла fil. Вторая строка содержит ошибку - неправильное объединение путей приводит к несуществующему пути.

4.2. Общая схема работы с файлом

Для обмена данными с файлом необходимо выполнить следующие операции:

  • Открытие файла с указанием его имени и цели (чтение, запись, добавление данных);
  • Выполнение одной или нескольких операций обмена данными с файлом;
  • Закрытие файла.

4.3. Открытие файла для записи или чтения данных – функция open.

>>>fp = open(file = drkt+'\\zapis1.txt', mode = 'w')
>>>type(fp)
<class '_io.TextIOWrapper'>
>>>fp
<_io.TextIOWrapper name='D:\\test\\zapis1.txt' mode='w' encoding='cp1251'>

Здесь fp – это файловый объект, который в других языках программирования обычно называют файловой переменной. Он сохраняет ссылку на открываемый файл и позволяет в дальнейшем ссылаться на файл, не указывая путь и имя открытого файла. В аргументе функции с именем file указывается путь и имя открываемого файла, а в аргументе с именем mode – предполагаемая цель его использования (w=write – для записи).

Аргументы функции с их именами могут располагаться в любом порядке. Если имя файла располагается на месте первого аргумента, а цель использования – на втором, то имена аргументов можно не указывать и просто вводить:

>>>fp = open(drkt+'\\zapis1.txt', 'w')
>>>fp
<_io.TextIOWrapper name='D:\\test\\zapis1.txt' mode='w' encoding='cp1251'>

Если путь в переменной drkt совпадает с рабочим каталогом, то его можно опустить, оставив только имя открываемого файла:

>>>fp = open('zapis1.txt', 'w')
>>>fp
<_io.TextIOWrapper name='zapis1.txt' mode='w' encoding='cp1251'>
>>>type(fp)
<class '_io.TextIOWrapper'>
>>>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», но с возможностью чтения из файла. В зависимости от значения этого аргумента тип создаваемой файловой переменной может быть разным.

Пример открытия бинарного файла:

>>>fp1 = open(drkt+'\\zapis2.bin', mode = 'wb+')
>>>fp1
<_io.BufferedRandom name='D:\\test\\zapis2.bin'>

4.4. Закрытие файла.

>>>fp.close()
>>>fp
<_io.TextIOWrapper name='zapis1.txt' mode='w' encoding='cp1251'>

После закрытия на объект все еще можно посмотреть.

4.5. Запись информации в файл с помощью метода write.

Метод write относится к объекту – файловой переменной. Создание списка с элементами-числами от 1 до 12 и запись их в файл по 4 числа на строке:

>>>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]

Создание списка с элементами-списками:

>>>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 - Видно, что вывод в файл получился не качественный

Попробуем изменить код:

>>>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. Первый способ чтения информации из текстового файла.

>>>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:

>>>sps2 = [int(i.strip()) for i in sps1]
>>>sps2
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

.strip - убирает пробелы с двух сторон.

4.7. Чтение информации из файла с помощью метода read.

Метод read, как и write, относится к объекту – файловой переменной. В качестве аргумента этого метода может задаваться целое число – количество символов или, если открыт бинарный файл, - количество байт, которое должно быть прочитано, соответственно, из текстового или бинарного файла, начиная с текущего положения маркера. Если указанное число превышает количество оставшихся символов (байт) в файле, то считываются все оставшиеся символы (байты). Если это число не указано, то считываются вся информация от маркера до конца файла. Метод возвращает строку с символами или совокупность байт, прочитанных из файла.

>>>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.

Эти методы позволяют прочитать из файла, начиная с текущего положения маркера, соответственно, одну строку символов (совокупность байт) или все строки (все байты).

>>>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) #dump – метод записи объекта в файл
>>>fp.close()

Запись, произведенная в файл: 耄锣 鐨谅瑡扬斔谄扯潫钌٩偨潮斔调灥溔逮 (Эти символы - это результат попытки прочитать бинарные данные как текст)

Теперь прочитаем данные из файла в объект mnoz2:

>>>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 и ранее созданный список 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()
>>>print(obj1)
{'table', 'book', 'iPhone', 'pen'}
>>>print(obj2)
[['Иванов И.', 1], ['Петров П.', 2], ['Сидоров С.', 3]]
>>>mnoz1 == obj1
True
>>>sps3 == obj2
True

5. Перенаправление потоков ввода и вывода данных.

>>>import sys
>>>vr_out = sys.stdout #Запоминаем текущий поток вывода
>>>fc = open('Stroka.txt', 'w') #Откроем файл вывода
>>>sys.stdout = fc #Перенацеливаем стандартный поток вывода на файл
>>>print('запись строки в файл') #Вывод теперь будет не на экран, а в файл
>>>sys.stdout=vr_out #Восстановление текущего потока
>>>print('запись строки на экран')  #Убеждаемся, что вывод на экран восстановился
запись строки на экран
>>>fc.close
<built-in method close of _io.TextIOWrapper object at 0x00000232E4FDA330>

В файле Stroka.txt находится: запись строки в файл

Точно также можно перенаправить поток ввода – 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