TerekhovFV 3 недель назад
Родитель 24304cc956
Сommit 1fb2abd14e

@ -0,0 +1 @@
запись строки в файл

Двоичные данные
TEMA6/data_file.dat

Двоичный файл не отображается.

Двоичные данные
TEMA6/image.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 59 KiB

Двоичные данные
TEMA6/images/3.1.2.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 48 KiB

Двоичные данные
TEMA6/images/3.1.3.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 56 KiB

Двоичные данные
TEMA6/images/4.1.2.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 102 KiB

Двоичные данные
TEMA6/images/4.1.4.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 125 KiB

Двоичные данные
TEMA6/images/6.1.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 8.1 KiB

Двоичные данные
TEMA6/images/7.1.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 59 KiB

@ -103,231 +103,673 @@ sys.stdout.write('Функция write\n')
Функция write
```
## 2. Цикл по перечислению – управляющая инструкция for.
## 2. Ввод данных с клавиатуры.
***Общее правило написания:***
for <Объект-переменная цикла> in <объект>:
<отступы><Блок инструкций 1 – тело цикла>
[else:
< отступы ><Блок инструкций 2 – если в цикле не сработал break>]
### 2.1. Для ввода используйте уже знакомую функцию input.
>Здесь <объект> - любой определенный до начала цикла объект из классов строка, список, кортеж, множество, словарь. <Объект-переменная цикла> - объект, в качестве значений которого поочередно будут задаваться элементы объекта, которые могут быть объектами любого типа. <Блок инструкций 1 – тело цикла> - совокупность инструкций, которая может содержать или не содержать инструкцию break, вызывающую досрочное завершение цикла при некоторых условиях. Блок инструкций 1 обычно выполняется многократно по мере того, как объект-переменная цикла принимает значения из сложного объекта. Если в цикле имеется необязательная часть: else и Блок инструкций 2, то он будет выполняться перед завершением цикла только в том случае, если при выполнении цикла не было его прерывания по инструкции break.
Если Блоке инструкций 1 или в Блоке инструкций 2 только одна инструкция, то её можно записывать без отступов сразу за двоеточием.
```python
psw=input('Введите пароль:')
print(psw)
print(type(psw))
```
Ответ программы:
```shell
Введите пароль:123
123
<class 'str'>
```
### 2.2. Ввод с контролем значения.
### 2.1. Простой цикл.
*Пусть вводится число, которое должно находиться в интервале значений от 17.5 до 23.8.*
```python
temperatura=5
for i in range(3,18,3):
temperatura+=i
print(temperatura)
while True:
znach=float(input('Задайте коэф.усиления = '))
if znach<17.5 or znach>23.8:
print('Ошибка!')
else:
break
```
Ответ программы:
```shell
50
Задайте коэф.усиления = 15.4
Ошибка!
Задайте коэф.усиления = 21.6
```
### 2.2. Более сложный цикл.
### 2.3. Ввод и обработка выражения, подлежащего расчету.
```python
sps=[2,15,14,8]
for k in sps:
if len(sps)<=10:sps.append(sps[0])
else: break
print("После первого цикла:",sps)
sps=[2,15,14,8]
for k in sps[:]:
if len(sps)<=10:sps.append(sps[0])
else: break
print("После второго цикла:",sps)
import math
print(eval(input('введите выражение для расчета = ')))
```
Ответ программы:
```shell
После первого цикла: [2, 15, 14, 8, 2, 2, 2, 2, 2, 2, 2]
После второго цикла: [2, 15, 14, 8, 2, 2, 2, 2]
введите выражение для расчета = math.log10(23/(1+math.exp(-3.24)))
1.34504378689765
```
>Во втором варианте итерация происходит по неизменяемой копии списка, поэтому цикл выполняется полное количество раз (4 раза), тогда как в первом варианте итерация происходит по изменяемому списку, и цикл завершается досрочно (через break, иначе цикл был бы бесконечным).
## 3. Ввод-вывод при работе с файлами.
***Работа с файлом требует указания источника данных - полного имени файла с путем доступа к его расположению. Обычно наибольшие затруднения вызывает корректная локализация этого пути.***
### 3.1. Функции для работы с путем к файлу.
### 2.3. Пример: создание списка с 10 целыми случайными числами из диапазона от 1 до 100. При этом, если сумма чисел не превышает 500, эта сумма должна быть отображена на экране.
>Эти функции собраны в модуле os. Поэтому при работе с файлами надо импортировать этот модуль командой.Эти функции собраны в модуле os. Поэтому при работе с файлами надо импортировать этот модуль командой
import os
Как и в других системах, в среде Python в любой момент времени подразумевается некоторый рабочий каталог. Какой рабочий каталог установлен в текущий момент времени? Это можно узнать с помощью функции
os.getcwd (cwd = current working directory).
os.getcwd()
Сохраните этот путь в переменной с именем, совпадающим с вашей фамилией в латинской транскрипции. Отобразите её значение с помощью функции print.
```python
import random as rn
sps5=[]
for i in range(10):
sps5.append(rn.randint(1,100))
ss=sum(sps5)
if ss>500: break
else:
print(ss)
import os
TerekhovFV=os.getcwd()
print(TerekhovFV)
```
Ответ программы (1 попытка):
Ответ программы:
```shell
/Users/fedorterekhov/Library/Mobile Documents/com~apple~CloudDocs/Учёба/3 курс/POAS_labs/python-labs
```
*Изменить расположение рабочего каталога можно обращением к уже многократно применявшейся функции os.chdir, аргументом которой будет символьная строка с указанием пути к каталогу, назначаемому в качестве рабочего.*
```python
import os
TerekhovFV=os.getcwd()
print(TerekhovFV)
os.chdir('/Users/fedorterekhov/Library')
print(os.getcwd())
```
Ответ программы (2 попытка):
Ответ программы:
```shell
484
/Users/fedorterekhov/Library/Mobile Documents/com~apple~CloudDocs/Учёба/3 курс/POAS_labs/python-labs
/Users/fedorterekhov/Library
```
*Фунция os.mkdir(path) - создает новую директорию:*
```python
import os
os.mkdir('TEMA6/test_directory')
```
Ответ программы:
![Создана директория test_directory](images/3.1.2.png)
*Фунция os.rmdir(path) - удаляет пустую директорию:*
```python
import os
os.rmdir('TEMA6/test_directory')
```
Ответ программы (3 попытка):
Ответ программы:
![Удалена директория test_directory](images/3.1.3.png)
**rmdir работает только с пустыми директориями! Для удаления непустых директорий нужно использовать shutil.rmtree().**
*Фунция os.listdir(path) - возвращает список файлов и директорий:*
```python
import os
print(os.listdir())
print(type(os.listdir()))
```
Ответ программы:
```shell
450
['TEMA4', 'TEMA3', 'TEMA2', 'TEMA5', 'README.md', '.gitignore', 'TEMA9', 'TEMA0', 'TEMA7', 'TEMA6', 'TEMA1', 'TEMA8', '.git']
<class 'list'>
```
*Фунция os.path.isdir(path) - проверяет, является ли путь директорией:*
```python
import os
print(os.path.isdir('TEMA6/test_directory'))
print(os.path.isdir('TEMA6/images'))
print(type(os.path.isdir('TEMA6/test_directory')))
```
Ответ программы (4 попытка):
Ответ программы:
```shell
False
True
<class 'bool'>
```
*С помощью функции os.path.abspath можно получить символьную строку, содержащую имя файла вместе с полным путем доступа к нему:*
```python
import os
fil=os.path.abspath("report.md")
print(fil)
```
Ответ программы (5 попытка):
Ответ программы:
```shell
359
/Users/fedorterekhov/Library/Mobile Documents/com~apple~CloudDocs/Учёба/3 курс/POAS_labs/python-labs/report.md
```
*Выделить путь доступа к файлу из строки, содержащей и этот путь, и имя файла можно с помощью функции os.path.dirname:*
```python
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
print(drkt)
```
>Объяснение поведения программы:
Почему вывод значения ss бывает не всегда:
else относится к циклу for, а не к if
Блок else выполняется только если цикл завершился нормально (без оператора break). Если срабатывает break, блок else пропускается.
Ответ программы:
```shell
/Users/fedorterekhov/Library/Mobile Documents/com~apple~CloudDocs/Учёба/3 курс/POAS_labs/python-labs
```
### 2.4. Пример с символьной строкой.
*Выделить имя файла/конечной директории из этой строки с отбрасыванием пути можно с помощью функции os.path.basename:*
```python
stroka='Это – автоматизированная система'
stroka1=""
for ss in stroka:
stroka1+=" "+ss
print(stroka1)
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
print(os.path.basename(drkt))
```
Ответ программы:
```shell
Э т о – а в т о м а т и з и р о в а н н а я с и с т е м а
python-labs
```
### 2.5. Запись цикла в строке. Пример: создание списка с синусоидальным сигналом.
*Функция os.path.split разделяет путь к файлу или директории на корневую часть пути и имя файла или имя директории. Возвращает кортеж, содержащий два элемента:*
```python
import math
import pylab
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
print(os.path.split(drkt))
print(type(os.path.split(drkt)))
```
sps2 = [math.sin(i * math.pi / 5 + 2) for i in range(100)]
Ответ программы:
```shell
('/Users/fedorterekhov/Library/Mobile Documents/com~apple~CloudDocs/Учёба/3 курс/POAS_labs', 'python-labs')
<class 'tuple'>
```
*С помощью функции os.path.exists можно проверить существует ли путь, заданный в символьной строке – аргументе функции. Возвращаемое значение: True или False.*
pylab.plot(sps2)
pylab.title('Синусоидальный сигнал')
pylab.xlabel('Отсчеты')
pylab.ylabel('Амплитуда')
pylab.grid(True)
pylab.show()
```python
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
print(os.path.exists(drkt + "/TEMA6"))
print(os.path.exists(drkt + "/TEMA66"))
```
Ответ программы:
![График](Graf_2.5.png)
```shell
True
False
```
## 3. Цикл «пока истинно условие» – управляющая инструкция while.
*Проверьте наличие файла с известным расположением с помощью функции os.path.isfile, аргументом которой должна быть символьная строка с путем и именем интересующего файла. Возвращаемое значение: True или False.*
***Общее правило написания:***
while <Условие>:
<отступы><Блок инструкций 1 – тело цикла>
[else:
<отступы><Блок инструкций 2 – если в цикле не сработал break>]
>Здесь <Условие> - некоторое логическое выражение. Если на очередном витке цикла оно принимает значение True (или ≠0), то выполняется Блок инструкций 1. При этом, если в этом блоке присутствует инструкция break и она будет выполнена, то цикл завершается, иначе – переходит к новому витку цикла. В блоке инструкций 1 могут быть изменены значения объектов, входящих в Условие и его значение тоже может измениться, Если же его значением останется True, то вновь выполняется Блок инструкций 1 и т.д. Если в цикле присутствует Блок инструкций 2, то он будет выполнен, если завершение цикла произошло не по инструкции break, а по значению False (или значению =0) Условия.
```python
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
print(os.path.isfile(drkt + "/TEMA6/report.md"))
print(os.path.isfile(drkt + "/TEMA6/report1.md"))
```
### 3.1. Цикл со счётчиком.
Ответ программы:
```shell
True
False
```
## 4. Общая схема работы с файлом.
*Для обмена данными с файлом необходимо выполнить следующие операции:*
* Открытие файла с указанием его имени и цели (чтение, запись, добавление данных);
* Выполнение одной или нескольких операций обмена данными с файлом;
* Закрытие файла.
### 4.1. Открытие файла для записи или чтения данных – функция open.
*При открытии файла необходимо указать имя файлы (с путем, если он не в рабочем каталоге) и цель работы с ним. Для открытия используется функция open.*
```python
rashod=300
while rashod:
print("Расход=",rashod)
rashod-=50
help(open)
```
Ответ программы:
```shell
Расход= 300
Расход= 250
Расход= 200
Расход= 150
Расход= 100
Расход= 50
Help on built-in function open in module io:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
Open file and return a stream. Raise OSError upon failure.
file is either a text or byte string giving the name (and the path
if the file isn't in the current working directory) of the file to
be opened or an integer file descriptor of the file to be
wrapped. (If a file descriptor is given, it is closed when the
returned I/O object is closed, unless closefd is set to False.)
mode is an optional string that specifies the mode in which the file
is opened. It defaults to 'r' which means open for reading in text
mode. Other common values are 'w' for writing (truncating the file if
it already exists), 'x' for creating and writing to a new file, and
'a' for appending (which on some Unix systems, means that all writes
append to the end of the file regardless of the current seek position).
In text mode, if encoding is not specified the encoding used is platform
dependent: locale.getpreferredencoding(False) is called to get the
current locale encoding. (For reading and writing raw bytes use binary
mode and leave encoding unspecified.) The available modes are:
========= ===============================================================
Character Meaning
--------- ---------------------------------------------------------------
'r' open for reading (default)
'w' open for writing, truncating the file first
'x' create a new file and open it for writing
'a' open for writing, appending to the end of the file if it exists
'b' binary mode
't' text mode (default)
'+' open a disk file for updating (reading and writing)
'U' universal newline mode (deprecated)
========= ===============================================================
The default mode is 'rt' (open for reading text). For binary random
access, the mode 'w+b' opens and truncates the file to 0 bytes, while
'r+b' opens the file without truncation. The 'x' mode implies 'w' and
raises an `FileExistsError` if the file already exists.
```
*Откройте файл zapis1.txt для записи данных с помощью инструкции*
```python
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
fp=open(file=drkt+'/TEMA6/zapis1.txt',mode='w')
```
Цикл завершился, потому что в Python число 0 интерпретируется как логическое значение False.
Ответ программы:
![Создан файл zapis1.txt](images/4.1.2.png)
*Здесь fp – это файловый объект, который в других языках программирования обычно называют файловой переменной. Он сохраняет ссылку на открываемый файл и позволяет в дальнейшем ссылаться на файл, не указывая путь и имя открытого файла. В аргументе функции с именем file указывается путь и имя открываемого файла, а в аргументе с именем mode – предполагаемая цель его использования (w=write – для записи).*
### 3.2. Пример с символьной строкой.
*Если путь в переменной drkt совпадает с рабочим каталогом, то его можно опустить, оставив только имя открываемого файла:*
```python
import math
stroka='Расчет процесса в объекте регулирования'
i=0
sps2=[]
while i<len(stroka):
r=1-2/(1+math.exp(0.1*i))
sps2.append(r)
print('Значение в момент',i,"=",r)
i+=1
fp=open('zapis1.txt','w')
```
*Тип и список атрибутов переменной fp:*
```python
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
fp=open(file=drkt+'/TEMA6/zapis1.txt',mode='w')
print(type(fp))
print(dir(fp))
```
Ответ программы:
```shell
<class '_io.TextIOWrapper'>
['_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
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
fp1=open(drkt+'/TEMA6/zapis2.bin',mode='wb+')
```
Ответ программы:
![График 3.2](Graf_3.2.png)
![Создан файл zapis2.bin](images/4.1.4.png)
***В бинарный файл можно без преобразования записывать объекты любого типа.***
### 3.3. Определение, является ли число простым (делится только на самого себя или 1).
*Если файл – символьный, то его тип обозначается «t», но это – значение по умолчанию и его можно не указывать. В символьный файл можно записывать только объекты типа str. Объекты других типов надо перед записью преобразовать к этому типу.*
### 4.2. Закрытие файла.
*Сразу после завершения работы с файлом его следует закрыть для обеспечения сохранности его содержимого. Это делается с помощью метода close, применяемого к объекту – файловой переменной.*
```python
fp.close()
```
### 4.3. Запись информации в файл с помощью метода write.
***Метод write относится к объекту – файловой переменной.***
```python
# Проверка одного числа
chislo = 267
kandidat = chislo // 2
while kandidat > 1:
if chislo % kandidat == 0:
print(chislo, ' имеет множитель ', kandidat)
break
kandidat -= 1
else:
print(chislo, ' является простым!')
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
sps=list(range(1,13))
fp=open(file=drkt+'/TEMA6/zapis3.txt',mode='w')
fp.write(str(sps[:4])+'\n')
fp.write(str(sps[4:8])+'\n')
fp.write(str(sps[8:])+'\n')
fp.close()
```
Файл zapis3.txt:
```
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]
print("\nПростые числа в диапазоне от 250 до 300:")
```
# Проверка всех чисел в диапазоне от 250 до 300
for chislo in range(250, 301):
kandidat = chislo // 2
while kandidat > 1:
if chislo % kandidat == 0:
break
kandidat -= 1
else:
print(chislo, end=' ')
```python
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
sps3=[['Иванов И.',1],['Петров П.',2],['Сидоров С.',3]]
fp3=open(drkt + '/TEMA6/zapis4.txt','w')
for i in range(len(sps3)):
stroka4=sps3[i][0]+' '+str(sps3[i][1])
fp3.write(stroka4)
fp3.close()
```
Файл zapis4.txt:
```
Иванов И. 1Петров П. 2Сидоров С. 3
```
```python
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
sps3=[['Иванов И.',1],['Петров П.',2],['Сидоров С.',3]]
gh=open(drkt+'/TEMA6/zapis5.txt','w')
for r in sps3:
gh.write(r[0]+' '+str(r[1])+'\n')
gh.close()
```
Файл zapis5.txt:
```
Иванов И. 1
Петров П. 2
Сидоров С. 3
```
## 5. Способы чтения информации.
*Информация в текстовом файле размещена последовательно, по строкам, с завершением каждой строки символом \n (конец строки). При чтении из файла из него извлекается часть информации, начиная с некоторого символа. Обычно, для удобства, считают, что перед этим символом стоит невидимый маркер (указатель), который при открытии файла устанавливается перед первым символом. После чтения части информации маркер перемещается и ставится перед символом, следующим за прочитанной частью информации.*
### 5.1. Первый способ чтения.
```python
import os
sps1=[]
dirr=os.path.dirname(os.path.abspath("report.md"))
fp=open(dirr + '/TEMA6/zapis3.txt')
for stroka in fp:
stroka=stroka.rstrip('\n')
stroka=stroka.replace('[','')
stroka=stroka.replace(']','')
sps1=sps1+stroka.split(',')
fp.close()
print(sps1)
```
Ответ программы:
```shell
['1', ' 2', ' 3', ' 4', '5', ' 6', ' 7', ' 8', '9', ' 10', ' 11', ' 12']
```
*В функции открытия файла использован только один аргумент, остальные – со значениями «по умолчанию».*
*Перед занесением строки в список с помощью метода rstrip, из неё удаляется символ конца строки, а с помощью метода replace – скобки.*
*Подумайте, как сделать так, чтобы список, полученный при чтении из файла, совпал с исходным.*
```python
import os
sps1=[]
dirr=os.path.dirname(os.path.abspath("report.md"))
fp=open(dirr + '/TEMA6/zapis3.txt')
for stroka in fp:
stroka=stroka.rstrip('\n')
stroka=stroka.replace('[','')
stroka=stroka.replace(' ','')
stroka=stroka.replace(']','')
sps1=sps1+stroka.split(',')
fp.close()
print(sps1)
```
Ответ программы:
```shell
['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
```
### 5.2. Чтение информации из файла с помощью метода read.
*Метод read, как и write, относится к объекту – файловой переменной. В качестве аргумента этого метода может задаваться целое число – количество символов или, если открыт бинарный файл, - количество байт, которое должно быть прочитано, соответственно, из текстового или бинарного файла, начиная с текущего положения маркера. Если указанное число превышает количество оставшихся символов (байт) в файле, то считываются все оставшиеся символы (байты). Если это число не указано, то считываются вся информация от маркера до конца файла. Метод возвращает строку с символами или совокупность байт, прочитанных из файла.*
```python
import os
dirr=os.path.dirname(os.path.abspath("report.md"))
fp=open(dirr + '/TEMA6/zapis3.txt')
stroka1=fp.read(12)
stroka2=fp.read()
fp.close()
print(stroka1)
print(stroka2)
```
Ответ программы:
```shell
1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]
```
### 5.3. Чтение информации с помощью методов readline и readlines.
*Эти методы позволяют прочитать из файла, начиная с текущего положения маркера, соответственно, одну строку символов (совокупность байт) или все строки (все байты).*
```python
import os
dirr=os.path.dirname(os.path.abspath("report.md"))
fp=open(dirr + '/TEMA6/zapis3.txt')
stroka1=fp.readline()
stroka2=fp.readlines()
fp.close()
print(stroka1)
print(stroka2)
```
Ответ программы:
```shell
[1, 2, 3, 4]
['[5, 6, 7, 8]\n', '[9, 10, 11, 12]\n']
```
## 6. Ввод-вывод объектов с использованием функций из модуля pickle.
*В модуле pickle содержатся функции для работы с бинарными файлами, в которые могут последовательно записываться или считываться целиком один или несколько объектов из оперативной памяти.*
### 6.1. Запись.
```python
import os
import pickle
mnoz1={'pen','book','pen','iPhone','table','book'} #Объект типа «множество»
fp=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/zapis6.mnz','wb') # Бинарный файл – на запись
pickle.dump(mnoz1,fp) #dump – метод записи объекта в файл
fp.close()
```
Ответ программы:
![Создан файл zapis6.mnz](images/6.1.png)
### 6.2. Чтение.
```python
import os
import pickle
fp=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/zapis6.mnz','rb')
mnoz2=pickle.load(fp) #load – метод чтения объекта из бинарного файла
fp.close()
print(mnoz2)
```
Ответ программы:
```shell
267 имеет множитель 89
{'iPhone', 'table', 'pen', 'book'}
```
**Объясните, почему он не совпадает с тем, что было задано при создании mnoz1. Инструкцией проверьте два объекта: mnoz1 и mnoz2 на совпадение.**
```python
import os
import pickle
Простые числа в диапазоне от 250 до 300:
251 257 263 269 271 277 281 283 293
mnoz1={'pen','book','pen','iPhone','table','book'} #Объект типа «множество»
fp=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/zapis6.mnz','wb') # Бинарный файл – на запись
pickle.dump(mnoz1,fp) #dump – метод записи объекта в файл
fp.close()
print(mnoz1)
fp=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/zapis6.mnz','rb')
mnoz2=pickle.load(fp) #load – метод чтения объекта из бинарного файла
fp.close()
print(mnoz2, '\n')
print(mnoz1==mnoz2)
print(mnoz1 is mnoz2)
```
### 3.4. Continue.
Ответ программы:
```shell
{'book', 'iPhone', 'table', 'pen'}
{'book', 'iPhone', 'table', 'pen'}
True
False
```
>Помимо инструкции break в обоих видах циклов могут использоваться инструкции continue, которые не вызывают завершения цикла, но завершают его текущий виток и обеспечивают переход к следующему витку.
**Почему порядок элементов отличается от исходного?**
Пример: Вывод четных чисел от 1 до 10 с использованием continue.
* Множество (set) в Python - неупорядоченная коллекция
* Элементы хранятся в порядке, оптимизированном для быстрого поиска
* Порядок зависит от хэш-значений элементов и может меняться между запусками
* Исходный порядок {'pen','book','iPhone','table'} не сохраняется
**Почему удалились дубликаты?**
* Множество автоматически удаляет повторяющиеся элементы
* Исходно было: {'pen','book','pen','iPhone','table','book'}
* Стало: {'pen','book','iPhone','table'} (4 элемента вместо 6)
**Проверка совпадения:**
* mnoz1 == mnoz2: True - объекты содержат одинаковые элементы
* mnoz1 is mnoz2: False - это разные объекты в памяти
### 6.3. Запись и чтение.
*Теперь с использованием тех же функций запишите в файл, а затем прочитайте два объекта разных типов: то же множество mnoz1 и ранее созданный список sps3. При считывании объекты извлекаются из файла в той же последовательности, в которой они в него записывались.*
```python
import os
import pickle
mnoz1={'pen','book','pen','iPhone','table','book'}
sps3=[['Иванов И.',1],['Петров П.',2],['Сидоров С.',3]]
fp=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/zapis6.mnz','rb')
fp=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/zapis7.2ob','wb')
pickle.dump(mnoz1,fp)
pickle.dump(sps3,fp)
fp.close()
fp=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/zapis7.2ob','rb')
obj1=pickle.load(fp) #Первое обращение к load читает первый объект
obj2=pickle.load(fp) #Второе – читает второй
fp.close()
print(obj1)
print(obj2)
```
Ответ программы:
```shell
{'book', 'pen', 'iPhone', 'table'}
[['Иванов И.', 1], ['Петров П.', 2], ['Сидоров С.', 3]]
```
## 7. Перенаправление потоков ввода и вывода данных.
```python
for i in range(1, 11):
if i % 2 != 0:
continue
print(i, end=' ')
import os
import sys
vr_out=sys.stdout #Запоминаем текущий поток вывода
fc=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/Stroka.txt','w') #Откроем файл вывода
sys.stdout=fc #Перенацеливаем стандартный поток вывода на файл
print('запись строки в файл') #Вывод теперь будет не на экран, а в файл
sys.stdout=vr_out #Восстановление текущего потока
print('запись строки на экран') #Убеждаемся, что вывод на экран восстановился
fc.close()
```
Ответ программы:
![Создан файл Stroka.txt со строкой](images/7.1.png)
Также на экран выведено сообщение:
```shell
запись строки на экран
```
*Точно также можно перенаправить поток ввода – sys.stdin – вместо клавиатуры – из файла.*
```python
import os
import sys
tmp_in = sys.stdin #Запоминаем текущий поток ввода
fd = open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/Stroka.txt', "r") #Открываем файл для ввода (чтения)
sys.stdin = fd #Перенацеливаем ввод на файл вместо клавиатуры
while True:
try:
line = input () #Считываем из файла строку
print(line) # Отображаем считанное
except EOFError:
break
```
Ответ программы:
```shell
2 4 6 8 10
запись строки в файл
```

@ -0,0 +1,84 @@
# Общее контрольное задание.
***Придумайте инструкции и запишите их в файл с расширением .py , которые выполняют следующие операции:***
* Создаётся объект-кортеж со 125 целыми случайными числами из диапазона от 6 до 56, представленными в виде символьных строк.
* Создаётся объект-список с вашей фамилией и 4 фамилиями ваших одноклассников.
* Записывается кортеж в бинарный файл.
* Записывается в этот же файл список и закрывается файл.
* Открывается этот файл для чтения и считывает из него данные в 2 новых объекта.
* Проверяется на совпадение новых объектов с исходными и выводится соответствующее сообщение.
* Разделяется кортеж на совокупности по 5 чисел в каждой и они записываются в виде отдельных списков со своими именами.
```python
import random
import pickle
import os
# 1. Создаётся объект-кортеж со 125 целыми случайными числами из диапазона от 6 до 56, представленными в виде символьных строк
numbers_tuple = tuple(str(random.randint(6, 56)) for _ in range(125))
# 2. Создаётся объект-список с вашей фамилией и 4 фамилиями ваших одноклассников
surnames_list = ["Терехов", "Жалнин", "Соловьёва", "Лыкова", "Бушманов"]
# 3. Записывается кортеж в бинарный файл
# 4. Записывается в этот же файл список и закрывается файл
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
fp = open(drkt + '/TEMA6/data_file.dat', 'wb')
pickle.dump(numbers_tuple, fp)
pickle.dump(surnames_list, fp)
fp.close()
# 5. Открывается этот файл для чтения и считывает из него данные в 2 новых объекта
fp = open(drkt + '/TEMA6/data_file.dat', 'rb')
loaded_tuple = pickle.load(fp)
loaded_list = pickle.load(fp)
fp.close()
# 6. Проверяется на совпадение новых объектов с исходными и выводится соответствующее сообщение
if numbers_tuple == loaded_tuple and surnames_list == loaded_list:
print("Объекты совпадают")
else:
print("Объекты не совпадают")
# 7. Разделяется кортеж на совокупности по 5 чисел в каждой и они записываются в виде отдельных списков со своими именами
lists_dict = {}
for i in range(0, len(loaded_tuple), 5):
chunk = list(loaded_tuple[i:i+5])
list_name = f"list_{i//5 + 1}"
lists_dict[list_name] = chunk
# Вывод созданных списков
for list_name, chunk in lists_dict.items():
print(f"{list_name} = {chunk}")
```
Ответ программы:
```shell
Объекты совпадают
list_1 = ['12', '9', '52', '39', '51']
list_2 = ['6', '50', '26', '43', '14']
list_3 = ['52', '20', '55', '18', '17']
list_4 = ['54', '20', '48', '56', '14']
list_5 = ['40', '17', '41', '7', '19']
list_6 = ['17', '40', '55', '11', '27']
list_7 = ['48', '38', '12', '26', '16']
list_8 = ['39', '21', '17', '41', '49']
list_9 = ['24', '16', '18', '6', '16']
list_10 = ['21', '10', '13', '33', '23']
list_11 = ['6', '31', '48', '6', '29']
list_12 = ['17', '34', '33', '40', '25']
list_13 = ['51', '6', '53', '36', '20']
list_14 = ['33', '17', '23', '51', '51']
list_15 = ['17', '44', '40', '17', '26']
list_16 = ['52', '54', '14', '32', '38']
list_17 = ['6', '10', '16', '45', '14']
list_18 = ['26', '40', '14', '29', '43']
list_19 = ['24', '49', '24', '36', '28']
list_20 = ['6', '17', '8', '7', '44']
list_21 = ['14', '22', '42', '24', '56']
list_22 = ['50', '6', '54', '27', '35']
list_23 = ['24', '13', '34', '9', '28']
list_24 = ['44', '34', '31', '16', '23']
list_25 = ['44', '10', '44', '23', '47']
```

@ -0,0 +1,3 @@
psw=input('Введите пароль:')
print(psw)
print(type(psw))

@ -0,0 +1,6 @@
while True:
znach=float(input('Задайте коэф.усиления = '))
if znach<17.5 or znach>23.8:
print('Ошибка!')
else:
break

@ -0,0 +1,2 @@
import math
print(eval(input('введите выражение для расчета = ')))

@ -0,0 +1,5 @@
import os
TerekhovFV=os.getcwd()
print(TerekhovFV)
os.chdir('/Users/fedorterekhov/Library')
print(os.getcwd())

@ -0,0 +1,5 @@
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
print(os.path.exists(drkt + "/TEMA6"))
print(os.path.exists(drkt + "/TEMA66"))

@ -0,0 +1,5 @@
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
print(os.path.isfile(drkt + "/TEMA6/report.md"))
print(os.path.isfile(drkt + "/TEMA6/report1.md"))

@ -0,0 +1,2 @@
import os
os.mkdir('TEMA6/test_directory')

@ -0,0 +1,2 @@
import os
os.rmdir('TEMA6/test_directory')

@ -0,0 +1,3 @@
import os
print(os.listdir())
print(type(os.listdir()))

@ -0,0 +1,4 @@
import os
print(os.path.isdir('TEMA6/test_directory'))
print(os.path.isdir('TEMA6/images'))
print(type(os.path.isdir('TEMA6/test_directory')))

@ -0,0 +1,3 @@
import os
fil=os.path.abspath("report.md")
print(fil)

@ -0,0 +1,4 @@
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
print(drkt)

@ -0,0 +1,4 @@
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
print(os.path.basename(drkt))

@ -0,0 +1,5 @@
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
print(os.path.split(drkt))
print(type(os.path.split(drkt)))

@ -0,0 +1,4 @@
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
fp=open(file=drkt+'/TEMA6/zapis1.txt',mode='w')

@ -0,0 +1,6 @@
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
fp=open(file=drkt+'/TEMA6/zapis1.txt',mode='w')
print(type(fp))
print(dir(fp))

@ -0,0 +1,4 @@
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
fp1=open(drkt+'/TEMA6/zapis2.bin',mode='wb+')

@ -0,0 +1,9 @@
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
sps=list(range(1,13))
fp=open(file=drkt+'/TEMA6/zapis3.txt',mode='w')
fp.write(str(sps[:4])+'\n')
fp.write(str(sps[4:8])+'\n')
fp.write(str(sps[8:])+'\n')
fp.close()

@ -0,0 +1,9 @@
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
sps3=[['Иванов И.',1],['Петров П.',2],['Сидоров С.',3]]
fp3=open(drkt + '/TEMA6/zapis4.txt','w')
for i in range(len(sps3)):
stroka4=sps3[i][0]+' '+str(sps3[i][1])
fp3.write(stroka4)
fp3.close()

@ -0,0 +1,8 @@
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
sps3=[['Иванов И.',1],['Петров П.',2],['Сидоров С.',3]]
gh=open(drkt+'/TEMA6/zapis5.txt','w')
for r in sps3:
gh.write(r[0]+' '+str(r[1])+'\n')
gh.close()

@ -0,0 +1,7 @@
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
sps3=[['Иванов И.',1],['Петров П.',2],['Сидоров С.',3]]
gh=open(drkt+'/TEMA6/zapis5.txt','w')
for r in sps3: gh.write(r[0]+' '+str(r[1])+'\n')
gh.close()

@ -0,0 +1,11 @@
import os
sps1=[]
dirr=os.path.dirname(os.path.abspath("report.md"))
fp=open(dirr + '/TEMA6/zapis3.txt')
for stroka in fp:
stroka=stroka.rstrip('\n')
stroka=stroka.replace('[','')
stroka=stroka.replace(']','')
sps1=sps1+stroka.split(',')
fp.close()
print(sps1)

@ -0,0 +1,12 @@
import os
sps1=[]
dirr=os.path.dirname(os.path.abspath("report.md"))
fp=open(dirr + '/TEMA6/zapis3.txt')
for stroka in fp:
stroka=stroka.rstrip('\n')
stroka=stroka.replace('[','')
stroka=stroka.replace(' ','')
stroka=stroka.replace(']','')
sps1=sps1+stroka.split(',')
fp.close()
print(sps1)

@ -0,0 +1,8 @@
import os
dirr=os.path.dirname(os.path.abspath("report.md"))
fp=open(dirr + '/TEMA6/zapis3.txt')
stroka1=fp.read(12)
stroka2=fp.read()
fp.close()
print(stroka1)
print(stroka2)

@ -0,0 +1,8 @@
import os
dirr=os.path.dirname(os.path.abspath("report.md"))
fp=open(dirr + '/TEMA6/zapis3.txt')
stroka1=fp.readline()
stroka2=fp.readlines()
fp.close()
print(stroka1)
print(stroka2)

@ -0,0 +1,6 @@
import os
import pickle
mnoz1={'pen','book','pen','iPhone','table','book'} #Объект типа «множество»
fp=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/zapis6.mnz','wb') # Бинарный файл – на запись
pickle.dump(mnoz1,fp) #dump – метод записи объекта в файл
fp.close()

@ -0,0 +1,6 @@
import os
import pickle
fp=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/zapis6.mnz','rb')
mnoz2=pickle.load(fp) #load – метод чтения объекта из бинарного файла
fp.close()
print(mnoz2)

@ -0,0 +1,16 @@
import os
import pickle
mnoz1={'pen','book','pen','iPhone','table','book'} #Объект типа «множество»
fp=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/zapis6.mnz','wb') # Бинарный файл – на запись
pickle.dump(mnoz1,fp) #dump – метод записи объекта в файл
fp.close()
print(mnoz1)
fp=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/zapis6.mnz','rb')
mnoz2=pickle.load(fp) #load – метод чтения объекта из бинарного файла
fp.close()
print(mnoz2, '\n')
print(mnoz1==mnoz2)
print(mnoz1 is mnoz2)

@ -0,0 +1,15 @@
import os
import pickle
mnoz1={'pen','book','pen','iPhone','table','book'}
sps3=[['Иванов И.',1],['Петров П.',2],['Сидоров С.',3]]
fp=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/zapis6.mnz','rb')
fp=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/zapis7.2ob','wb')
pickle.dump(mnoz1,fp)
pickle.dump(sps3,fp)
fp.close()
fp=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/zapis7.2ob','rb')
obj1=pickle.load(fp) #Первое обращение к load читает первый объект
obj2=pickle.load(fp) #Второе – читает второй
fp.close()
print(obj1)
print(obj2)

@ -0,0 +1,9 @@
import os
import sys
vr_out=sys.stdout #Запоминаем текущий поток вывода
fc=open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/Stroka.txt','w') #Откроем файл вывода
sys.stdout=fc #Перенацеливаем стандартный поток вывода на файл
print('запись строки в файл') #Вывод теперь будет не на экран, а в файл
sys.stdout=vr_out #Восстановление текущего потока
print('запись строки на экран') #Убеждаемся, что вывод на экран восстановился
fc.close()

@ -0,0 +1,11 @@
import os
import sys
tmp_in = sys.stdin #Запоминаем текущий поток ввода
fd = open(os.path.dirname(os.path.abspath("report.md")) + '/TEMA6/Stroka.txt', "r") #Открываем файл для ввода (чтения)
sys.stdin = fd #Перенацеливаем ввод на файл вместо клавиатуры
while True:
try:
line = input () #Считываем из файла строку
print(line) # Отображаем считанное
except EOFError:
break

@ -0,0 +1,41 @@
import random
import pickle
import os
# 1. Создаётся объект-кортеж со 125 целыми случайными числами из диапазона от 6 до 56, представленными в виде символьных строк
numbers_tuple = tuple(str(random.randint(6, 56)) for _ in range(125))
# 2. Создаётся объект-список с вашей фамилией и 4 фамилиями ваших одноклассников
surnames_list = ["Терехов", "Жалнин", "Соловьёва", "Лыкова", "Бушманов"]
# 3. Записывается кортеж в бинарный файл
# 4. Записывается в этот же файл список и закрывается файл
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
fp = open(drkt + '/TEMA6/data_file.dat', 'wb')
pickle.dump(numbers_tuple, fp)
pickle.dump(surnames_list, fp)
fp.close()
# 5. Открывается этот файл для чтения и считывает из него данные в 2 новых объекта
fp = open(drkt + '/TEMA6/data_file.dat', 'rb')
loaded_tuple = pickle.load(fp)
loaded_list = pickle.load(fp)
fp.close()
# 6. Проверяется на совпадение новых объектов с исходными и выводится соответствующее сообщение
if numbers_tuple == loaded_tuple and surnames_list == loaded_list:
print("Объекты совпадают")
else:
print("Объекты не совпадают")
# 7. Разделяется кортеж на совокупности по 5 чисел в каждой и они записываются в виде отдельных списков со своими именами
lists_dict = {}
for i in range(0, len(loaded_tuple), 5):
chunk = list(loaded_tuple[i:i+5])
list_name = f"list_{i//5 + 1}"
lists_dict[list_name] = chunk
# Вывод созданных списков
for list_name, chunk in lists_dict.items():
print(f"{list_name} = {chunk}")

@ -0,0 +1,3 @@
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]

@ -0,0 +1 @@
Иванов И. 1Петров П. 2Сидоров С. 3

@ -0,0 +1,3 @@
Иванов И. 1
Петров П. 2
Сидоров С. 3

Двоичные данные
TEMA6/zapis6.mnz

Двоичный файл не отображается.

Двоичные данные
TEMA6/zapis7.2ob

Двоичный файл не отображается.
Загрузка…
Отмена
Сохранить