diff --git a/TEMA6/files/Stroka.txt b/TEMA6/files/Stroka.txt new file mode 100644 index 0000000..3b4ec0e --- /dev/null +++ b/TEMA6/files/Stroka.txt @@ -0,0 +1 @@ + diff --git a/TEMA6/files/binary.bin b/TEMA6/files/binary.bin new file mode 100644 index 0000000..59d393b Binary files /dev/null and b/TEMA6/files/binary.bin differ diff --git a/TEMA6/files/zapis1.txt b/TEMA6/files/zapis1.txt new file mode 100644 index 0000000..e69de29 diff --git a/TEMA6/files/zapis2.bin b/TEMA6/files/zapis2.bin new file mode 100644 index 0000000..e69de29 diff --git a/TEMA6/files/zapis3.txt b/TEMA6/files/zapis3.txt new file mode 100644 index 0000000..8132aa8 --- /dev/null +++ b/TEMA6/files/zapis3.txt @@ -0,0 +1,3 @@ +[1, 2, 3, 4] +[5, 6, 7, 8] +[9, 10, 11, 12] diff --git a/TEMA6/files/zapis4.txt b/TEMA6/files/zapis4.txt new file mode 100644 index 0000000..edd0c45 --- /dev/null +++ b/TEMA6/files/zapis4.txt @@ -0,0 +1 @@ + . 1 . 2 . 3 \ No newline at end of file diff --git a/TEMA6/files/zapis5.txt b/TEMA6/files/zapis5.txt new file mode 100644 index 0000000..ecde2d7 --- /dev/null +++ b/TEMA6/files/zapis5.txt @@ -0,0 +1,3 @@ + . 1 + . 2 + . 3 diff --git a/TEMA6/files/zapis6.mnz b/TEMA6/files/zapis6.mnz new file mode 100644 index 0000000..45efc74 Binary files /dev/null and b/TEMA6/files/zapis6.mnz differ diff --git a/TEMA6/files/zapis7.2ob b/TEMA6/files/zapis7.2ob new file mode 100644 index 0000000..e890d01 Binary files /dev/null and b/TEMA6/files/zapis7.2ob differ diff --git a/TEMA6/report.md b/TEMA6/report.md new file mode 100644 index 0000000..05ffae3 --- /dev/null +++ b/TEMA6/report.md @@ -0,0 +1,390 @@ +# Отчет по теме 6 + +Беженарь Алёна, А-02-23 + +## Ввод-вывод данных и операции с файлами + +## 1. Настройка текущего каталога. + +```py +>>> import os +>>> os.chdir("C:\\Users\\Дружок\\Desktop\\ПОАС\\python-labs\\TEMA6") +``` + +## 2. Вывод данных на экран дисплея. + +Вывод данных на экран дисплея в среде Python можно осуществить разными способами, которые будут рассматриваться ниже. +### 2.1. Вывод в командной строке. +При работе с инструкциями, вводимыми в командной строке интерпретатора или среды IDLE, можно пользоваться так называемым "эхо-выводом", однако внутри скриптов и пользовательских функций такой способ не будет работать. +```py +>>> stroka = "Автоматизированная система управления" +>>> stroka # Эхо-вывод переменной stroka + 'Автоматизированная система управления' +``` + +### 2.2. Вывод с использованием функции print. +Самый простой способ вывода данных на дисплей - использование встроенной функции print. +```py +>>> fff = 234; gg = "Значение температуры =" +>>> print(gg, fff) # Вывод нескольких объектов за одно обращение к функции + Значение температуры = 234 +``` +Для данной функции можно настроить определенный разделитель: +```py +>>> print(gg, fff, sep = "/") # Вывод объектов с заданным разделителем + Значение температуры =/234 +``` +Также можно задать некоторый символ или их последовательность, который будет выводиться в конце строки (по умолчанию это переход на новую строку). +```py +>>> print(gg, fff, sep = "/", end = "***"); print("____") # Вывод объектов с указанным окончанием строки + Значение температуры =/234***____ +``` +Внутри данной функции можно использовать многострочные последовательности, которые будут выводиться в соответствующем количестве строк. +```py +>>> print("""Здесь может выводиться +... большой текст, +... занимающий несколько строк""") + Здесь может выводиться + большой текст, + занимающий несколько строк +``` +Однако это не работает с обычными символьными последовательностями, записанными на новых строках: +```py +>>> print("Здесь может выводиться", +... "большой текст,", +... "занимающий несколько строк") + Здесь может выводиться большой текст, занимающий несколько строк +``` +Текст выводится в 1 строку. + +### 2.3. Вывод с использованием метода write объекта sys.stdout. + +Стандартный же способ вывода данных - через поток вывода stdout, находящийся в модуле sys. В данном методе не происходит автоматический переход на новую строку при последовательном его использовании, поэтому необходимо вручную добавлять символ "\n". + +```py +>>> import sys +>>> sys.stdout.write("Функция write") # Вывод строки с помощью метода write + Функция write13 # Число 13 в конце - количество символов в строке +>>> sys.stdout.write("Функция write\n") + Функция write + 14 +``` +## 3. Ввод данных с клавиатуры. +Для ввода данных с клавиатуры используется изученная ранее функция input. +```py +>>> psw = input("Введите пароль: ") # Приглашение к вводу + Введите пароль: 12345 # Отображение соответствующего приглашения и ввод данных +>>> psw + '12345' +>>> print(psw) + 12345 +>>> type(psw) + +``` +Ввод значений можно контролировать с помощью циклов и оператора прерывания: + +```py +>>> while True: +... znach = float(input("Задайте коэф. усиления = ")) +... if znach < 17.5 or znach > 23.8: +... print("Ошибка!") +... else: +... break +... + Задайте коэф. усиления = 15.4 + Ошибка! + Задайте коэф. усиления = 21.6 +>>> +``` + +Также с помощью оператора ввода можно вычислять значения выражений, корректно заданных пользователем: + +```py +>>> import math +>>> print(eval(input("Введите выражение для расчета: "))) + Введите выражение для расчета: math.log10(23 / (1 + math.exp(-3.24))) + 1.34504378689765 +``` + +## 4. Ввод-вывод при работе с файлами. +При работе с файлом необходимо указывать источник данных - полное имя файла с путем доступа к его расположению. +### 4.1. Функции для работы с путём к файлу. +Если файл находится в текущем рабочем каталоге, то для получения полного пути доступа до этого файла будет проще сначала получить путь до рабочего каталога. Сделать это можно с помощью функции getcwd модуля os. +```py +>>> import os +>>> os.getcwd() # Отображение текущего рабочего каталога + 'C:\\Users\\Дружок\\Desktop\\ПОАС\\python-labs\\TEMA6' +>>> Bezhenar = os.getcwd() +>>> print(Bezhenar) + C:\Users\Дружок\Desktop\ПОАС\python-labs\TEMA6 +``` +В этом модуле также есть функции, позволяющие создавать и удалять директории, проверять их наличие в рабочем каталоге и другие. + +```py +>>> os.mkdir("New directory") # Создание новой директории +>>> os.listdir() #Возвращает список имен файлов находящихся в рабочей директории + ['.gitkeep', 'New directory', 'report.md'] +>>> os.path.isdir("New directory"); os.path.isdir("ABC") # Проверка наличия директории в рабочем каталоге + True + False +>>> os.rmdir('New directory') # Удаление директории +>>> os.listdir() + ['.gitkeep', 'report.md'] +``` +Также полный путь доступа к файлу можно получить с помощью отдельной функции abspath. Затем из него можно выделить путь к директории, содержащей файл, и имя самого файла с помощью соответствующих функций dirname и basename. +```py +>>> fil = os.path.abspath("report.md") # Получение полного пути к файлу +>>> print(fil) + C:\Users\Дружок\Desktop\ПОАС\python-labs\TEMA6\report.md +>>> drkt = os.path.dirname(fil) # Выделение пути доступа к файлу +>>> print(drkt) + C:\Users\Дружок\Desktop\ПОАС\python-labs\TEMA6 +>>> name = os.path.basename(fil) # Выделение имени файла +>>> print(name) + report.md +>>> directory, fileName = os.path.split(fil) # Разделяет путь к файлу на путь доступа к файлу и его имя (Возвращает кортеж из этих двух составляющих) +>>> print(directory);print(fileName) + C:\Users\Дружок\Desktop\ПОАС\python-labs\TEMA6 + report.md +``` +Проверка того, указывает ли путь на существующий файл, осуществляется с помощью функции isfile. +```py +>>> os.path.isfile(fil) # Проверка пути к файлу + True +>>> os.path.isfile("ABC.txt") + False +``` + +### 4.2. Общая схема работы с файлом. +Для обмена данными с файлом необходимо выполнить следующие операции: +*Открытие файла с указанием его имени и цели (чтение, запись, добавление данных); +*Выполнение одной или нескольких операций обмена данными с файлом; +*Закрытие файла. +### 4.3. Открытие файла для записи и чтения файла. +Для открытия файла используется функция open, в которой необходимо указывать путь и имя открывающегося файла и цель его использования. Имена аргументов в данной функции можно опускать, но тогда сами аргументы должны идти в правильном порядке. (Если же файл находится в текущем рабочем каталоге, то полный путь к нему можно не указывать, будет достаточно только его имени.) + +Различные значения аргумента mode: + +*w - запись/перезапись файла +*w+ - чтение и запись/перезапись файла +*r - только чтение существующего файла +*r+ - чтение и/или запись в существующий файл +*a - запись в конец существующего файла +*a+ - запись в конец существующего файла с возможностью чтения + +```py +>>> fp = open(file = drkt + "\\zapis1.txt", mode = "w") # Открытие файла с явным указанием пути и цели использования +>>> fp = open(drkt + "\\zapis1.txt", "w") # Открытие файла без указания имен аргументов +>>> fp = open("zapis1.txt", "w") # Открытие файла, путь к которому совпадает с рабочим каталогом +>>> 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__', '__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'] +>>> fp1 = open(drkt + "\\zapis2.bin", "wb+") # Открытие бинарного файла +``` + +### 4.4. Закрытие файла. +После завершения работы с файлом его необходимо закрывать для обеспечения сохранности его содержимого. Это делается с помощью функции close, применяемой к файловой переменной. +```py +>>> fp.close() +``` + +### 4.5. Запись информации в файл. +Стандартный вариант записи в файл - использование метода write. +```py +>>> 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") # Запись в файл первых 4 значений + переход на новую строку + 13 +>>> fp2.write(str(sps[4:8]) + "\n") + 13 +>>> fp2.write(str(sps[8:]) + "\n") + 16 +>>> fp2.close() +``` +В файле можно наблюдать следующий вывод: +```py +[1, 2, 3, 4] +[5, 6, 7, 8] +[9, 10, 11, 12] +``` + +Запись данных также можно проводить внутри цикла: + +```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() +``` +Получившаяся запись: +```py +Иванов И. 1Петров П. 2Сидоров С. 3 +``` +Вышло совсем не так, как мы хотели изначально. +Попробуем иначе: +```py +>>> fp3.close() +>>> gh = open("zapis5.txt", "w") +>>> for r in sps3: +... gh.write(r[0] + " " + str(r[1]) + "\n") +... + 12 + 12 + 13 +>>> gh.close() +``` +Вывод в файле: +```py +Иванов И. 1 +Петров П. 2 +Сидоров С. 3 +``` +Теперь делается с переходом на новую строку. + +Весь этот цикл можно было бы представить в одной строчке, содержимое файла получилось бы таким же. +```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") # Удаление символа \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'] +``` +Как видно из результата, прочитанные данные несколько отличаются от исходных. Исправить это можно, внеся небольшие изменения в алгоритм чтения: +```py +>>> sps2 = [] +>>> fp = open("zapis3.txt") +>>> for stroka in fp: +... stroka = stroka.rstrip("\n") +... stroka = stroka.replace("[", "").replace("]", "").replace(" ", "") +... sps2 = sps2 + [int(x) for x in stroka.split(",")] +... +>>> fp.close() +>>> sps2 + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] +``` +### 4.7. Чтение информации с помощью метода read. +Метод read, также как и write, относится к объекту - файловой переменной. В качестве аргумента можно задать определенное количество символов/байт, которое должно быть прочитано из файла. +```py +>>> fp = open("zapis3.txt") +>>> stroka1 = fp.read(12) # Чтение первых 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. +Методы readline и readlines позволяют прочитать одну или несколько строк символов соответственно. (Чтение происходит с текущего положения маркера) +```py +>>> fp = open("zapis3.txt") +>>> stroka1 = fp.readline() # Чтение первой строки файла +>>> stroka2 = fp.readline() # Чтение второй строки файла +>>> fp.close() +>>> fp = open("zapis3.txt") +>>> stroka3 = fp.readlines() # Чтение всех строк файла +>>> fp.close() +>>> stroka1 + '[1, 2, 3, 4]\n' +>>> stroka2 + '[5, 6, 7, 8]\n' +>>> stroka3 + ['[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() +``` +Содержимое файла: +```py +耄锣 鐨谆楐桯湥钌Ѣ潯殔谅瑡扬斔调灥溔逮 +``` +Получение объекта из файла можно осуществить с помощью метода load: +```py +>>> fp = open("zapis6.mnz", "rb") +>>> mnoz2 = pickle.load(fp) # Получение объекта из файла +>>> fp.close() +>>> mnoz2 + {'book', 'iPhone', 'table', 'pen'} +>>> 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) # Получение объекта, записанного первым +>>> obj2 = pickle.load(fp) # Получение объекта, записанного вторым +>>> fp.close() +>>> obj1 + {'book', 'iPhone', 'table', 'pen'} +>>> obj2 + [['Иванов И.', 1], ['Петров П.', 2], ['Сидоров С.', 3]] +``` +## 5. Перенаправление потоков ввода и вывода данных. +Потоки ввода-вывода можно перенаправлять, например в файл: +```py +>>> import sys +>>> vr_out = sys.stdout # Сохранение текущего потока вывода +>>> fc = open("Stroka.txt", "w") +>>> sys.stdout = fc # Перезапись потока вывода с экрана на файл +>>> print("Запись строки в файл") +>>> fc.close() +>>> sys.stdout = vr_out # Возвращение истинного значения потока вывода +>>> print("Запись строки на экран") + Запись строки на экран +``` +В результате данных действий строка "Запись строки в файл" записалась в файл Stroka.txt: +```py +Запись строки в файл +``` +Аналогичную операцию можно провести и для потока ввода sys.stdin – вместо клавиатуры – из файла: +```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..cc6121c --- /dev/null +++ b/TEMA6/task.md @@ -0,0 +1,192 @@ +\# Общее контрольное задание по теме 6 + + + +Беженарь Алёна, А-02-23 + + + +\## Задание + + + +\* Создаётся объект-кортеж со 125 целыми случайными числами из диапазона от 6 до 56, представленными в виде символьных строк. + +\* Создаётся объект-список с вашей фамилией и 4 фамилиями ваших одноклассников. + +\* Записывается кортеж в бинарный файл. + +\* Записывается в этот же файл список и закрывается файл. + +\* Открывается этот файл для чтения и считывает из него данные в 2 новых объекта. + +\* Проверяется на совпадение новых объектов с исходными и выводится соответствующее сообщение. + +\* Разделяется кортеж на совокупности по 5 чисел в каждой и они записываются в виде отдельных списков со своими именами. + + + +\## Решение + + + +```py + +>>> #1 + +>>> + +>>> import random + +>>> kort = tuple(\[str(random.randint(6, 56)) for i in range(125)]) + +>>> kort + +  ('10', '15', '22', '35', '11', '14', '8', '22', '8', '32', '6', '47', '40', '45', '21', '36', '17', '45', '17', '14', '29', '50', '49', '26', '8', '34', '44', '51', '53', '22', '34', '47', '7', '28', '42', '28', '21', '49', '28', '50', '37', '48', '40', '40', '44', '28', '12', '24', '9', '16', '51', '13', '51', '21', '16', '52', '22', '15', '21', '8', '56', '23', '17', '23', '47', '8', '17', '53', '6', '36', '42', '56', '40', '12', '31', '52', '27', '8', '30', '51', '8', '46', '7', '23', '41', '42', '7', '44', '27', '10', '40', '48', '24', '46', '21', '54', '41', '8', '43', '29', '10', '37', '26', '48', '30', '31', '51', '32', '43', '43', '44', '17', '15', '43', '27', '39', '17', '39', '28', '53', '36', '13', '32', '30', '49') + +>>> len(kort) + +  125 + +>>> + +>>> #2 + +>>> + +>>> lastnames = \["Bezhenar", "Stepanov", "Volodin", "Kireev", "Kuzmenko"] + +>>> + +>>> #3 + +>>> + +>>> import os, pickle + +>>> os.chdir("C:\\\\Users\\\\Дружок\\\\Desktop\\\\ПОАС\\\\python-labs\\\\TEMA6") + +>>> fp = open("binary.bin", "wb") + +>>> pickle.dump(kort, fp) + +>>> + +>>> #4 + +>>> + +>>> pickle.dump(lastnames, fp) + +>>> fp.close() + +>>> + +>>> #5 + +>>> + +>>> fp = open("binary.bin", "rb") + +>>> newKort = pickle.load(fp) + +>>> newList = pickle.load(fp) + +>>> newKort + +  ('10', '15', '22', '35', '11', '14', '8', '22', '8', '32', '6', '47', '40', '45', '21', '36', '17', '45', '17', '14', '29', '50', '49', '26', '8', '34', '44', '51', '53', '22', '34', '47', '7', '28', '42', '28', '21', '49', '28', '50', '37', '48', '40', '40', '44', '28', '12', '24', '9', '16', '51', '13', '51', '21', '16', '52', '22', '15', '21', '8', '56', '23', '17', '23', '47', '8', '17', '53', '6', '36', '42', '56', '40', '12', '31', '52', '27', '8', '30', '51', '8', '46', '7', '23', '41', '42', '7', '44', '27', '10', '40', '48', '24', '46', '21', '54', '41', '8', '43', '29', '10', '37', '26', '48', '30', '31', '51', '32', '43', '43', '44', '17', '15', '43', '27', '39', '17', '39', '28', '53', '36', '13', '32', '30', '49') + +>>> newList + +  \['Bezhenar', 'Stepanov', 'Volodin', 'Kireev', 'Kuzmenko'] + +>>> fp.close() + +>>> + +>>> #6 + +>>> + +>>> if (newKort == kort): print("Кортежи совпадают") + +... + +  Кортежи совпадают + +>>> if (newList == lastnames): print("Списки совпадают") + +... + +  Списки совпадают + +>>> + +>>> #7 + +>>> + +>>> for i in range(0, len(kort), 5): + +  exec(f'spis{i//5} = list(kort\[i:i + 5])') + + + +>>> for i in range(len(kort) // 5): + +  exec(f'print("spis" + str(i) + ":", spis{i})') + + + +  spis0: \['10', '15', '22', '35', '11'] + +  spis1: \['14', '8', '22', '8', '32'] + +    spis2: \['6', '47', '40', '45', '21'] + +    spis3: \['36', '17', '45', '17', '14'] + +    spis4: \['29', '50', '49', '26', '8'] + +    spis5: \['34', '44', '51', '53', '22'] + +    spis6: \['34', '47', '7', '28', '42'] + +    spis7: \['28', '21', '49', '28', '50'] + +    spis8: \['37', '48', '40', '40', '44'] + +    spis9: \['28', '12', '24', '9', '16'] + +    spis10: \['51', '13', '51', '21', '16'] + +    spis11: \['52', '22', '15', '21', '8'] + +    spis12: \['56', '23', '17', '23', '47'] + +    spis13: \['8', '17', '53', '6', '36'] + +    spis14: \['42', '56', '40', '12', '31'] + +    spis15: \['52', '27', '8', '30', '51'] + +    spis16: \['8', '46', '7', '23', '41'] + +    spis17: \['42', '7', '44', '27', '10'] + +    spis18: \['40', '48', '24', '46', '21'] + +    spis19: \['54', '41', '8', '43', '29'] + +    spis20: \['10', '37', '26', '48', '30'] + +    spis21: \['31', '51', '32', '43', '43'] + +    spis22: \['44', '17', '15', '43', '27'] + +    spis23: \['39', '17', '39', '28', '53'] + +    spis24: \['36', '13', '32', '30', '49'] + +``` +