# Отчет по теме 6 <Лазарев Данил Вячеславович>
#А-01-23

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

```
import os
os.chdir("C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA6")
```

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

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

Реализация эхо-вывода в терминал.
```
stroka='Автоматизированная система управления'
stroka
'Автоматизированная система управления'
```

## 2.2 Вывод с использованием функции print
Данная функция применима и в командной строке, и в функциях.
``
fff = 234.5; gg = 'Значение температуры = '
print(gg, fff)
Значение температуры =  234.5
```

По умолчанию выводимые объекты разделяются одним пробелом. Если нужен другой разделитель его можно указать в отдельном аргументе sep

```
print(gg, fff, sep='/')
Значение температуры = /234.5
```

По умолчанию после того, как функция print() сделала вывод, происходит перенос каретки на
следующую строку. Это тоже можно изменить. Параметр end по умолчанию имеет значение "\n",
его можно изменить на другое.

```
print(gg, fff,sep='/',end='***'); print('____')
Значение температуры = /234.5***____

print()

 >>
```

Если текст большой,то можно расположить его в несколько строк:

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

```

## 2.3. Вывод с использованием write объекта stdout (поток стандартного вывода) модуля sys.

```
help(sys.stdout.write)
Help on method write in module idlelib.run:

write(s) method of idlelib.run.StdOutputFile instance
    Write string to stream.
    Returns the number of characters written (which is always equal to
    the length of the string).

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

>>sys.stdout.write("Функция write\n") #Добавлен переход н новую строку
Функция write
14
```

Заметим, что функция выводит текст, но также возвращает число. Это число отображает количество
введенных символов.
   
## 3. Ввод данных с клавиатуры.
Для ввода используйте уже знакомую функцию 'input'.
```
psw = input('Введите пароль:')
Введите пароль:12345
psw
>>'12345'
type(psw)
>> <class 'str'>
```


```
# Пример 1
while True:
    znach=float(input('Задайте коэф.усиления = '))
    if znach < 17.5 or znach > 23.8:
        print('Ошибка!')
    else:
        break

	
Задайте коэф.усиления = 18
znach
>>18.0

Задайте коэф.усиления = 17
>> Ошибка!

#Пример 2
import math
print(eval(input('введите выражение для расчета = ')))
введите выражение для расчета = math.log10(23 / (1 + math.exp(-3.24)))
>>1.34504378689765

```

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

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

```
import os
os.getcwd()
>> 'C:\\Users\\Dannyan\\AppData\\Local\\Programs\\Python\\Python313'
Lazarev = os.getcwd()
print(Lazarev)
C:\Users\Dannyan\AppData\Local\Programs\Python\Python313
Lazarev
>> 'C:\\Users\\Dannyan\\AppData\\Local\\Programs\\Python\\Python313'
os.chdir('C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA6')
os.getcwd()
>> 'C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA6'


#Изучение функции mkdir
os.mkdir('C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA6\\new')
os.listdir('C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA6')
>> ['.gitkeep', 'new', 'protocol6.py']

#Удаление каталога 

os.rmdir("new")
>> Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    os.rmdir("new")
PermissionError: [WinError 5] Отказано в доступе: 'new'
???

#Показать список всех файлов и папок, вложенных в текущую

os.listdir('C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA6')
>> ['.gitkeep', 'protocol6.py']

#Проверка существования каталога
help(os.path.isdir)
Help on function isdir in module genericpath:

isdir(s)
    Return true if the pathname refers to an existing directory.
    
os.path.isdir('new')
>> True
os.path.isdir('frog')
>> False

# С помощью функции os.path.abspath можно получить символьную строку, содержащую имя файла вместе с полным  путем доступа к нему: 
fil=os.path.abspath("new")
fil
>> 'C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA6\\new'

#Отделение из абсолютного пути только каталога/только имени файла
drkt=os.path.dirname(fil)
drkt
>> 'C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA6'

bs = os.path.basename(drkt)
bs
>> 'TEMA6'


#Разделение на кортеж из пути и из имени файла
res  = os.path.split('C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA6\\new')
res
('C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA6', 'new')


#Проверка существования любого объекта
os.path.exists('C:\Games')
True
os.path.exists('C:\load')
False

#Проверка существования файла
os.path.isfile(fil)
False
os.path.isfile('C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA6\\new')
False

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

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

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

•   Выполнение одной или нескольких операций обмена данными с файлом;

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

## 4.3  Открытие файла для записи или чтения

```
fp=open(file=drkt+'\\zapis1.txt',mode='w')             
fp             
>> <_io.TextIOWrapper name='C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA6\\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__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__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',mode='wb+')
fp1               
>> <_io.BufferedRandom name='C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA6\\zapis2.bin'>
```

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

Когда файл успешно открывается / создается и открывается, ему задается целочисленный
номер, называемый файловым дескриптором. Он создается только на один сеанс работы и указывает,
с каким именно файлом нужно работать.

После того, как программа отработала, надо очистить ресурсы, связанные с файлом (область
в оперативной памяти, в буфере при буферизации), и удалить дескриптор. Если не закрыть
файл, это может его повредить, данные могут быть утеряны или система может быть перегружена,
т.к. исчерпается ресурс оперативной памяти. Для закрытия есть метод close().

```
fp.close()
fp.closed
>> True
os.listdir('C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA6')
               
>> ['.gitkeep', 'new', 'protocol6.py', 'zapis1.txt', 'zapis2.bin']
```

## 4.5. Запись информации в файл.

```
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()
```

Посмотрим, как выглядит файл, в текстовом редакторе:

![]ris1.png

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

```
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()
```

Файл в текстовом редакторе выглядит так:

![]ris2.png

Видно, что строки склеились там, где не надо. Попробуем по-другому.

```
for r in sps3:
    gh.write(r[0]+' '+str(r[1])+'\n')
     
>> 12
>> 12
>> 13
gh.close()
```

Получим новый вид данных в файле:
![]ris3.png

## 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()

sps1
         
>> ['1', ' 2', ' 3', ' 4', '5', ' 6', ' 7', ' 8', '9', ' 10', ' 11', ' 12']
```

Метод .rstrip() убирает символы с конца строки. Если не задавать аргументов,
он удалит любые пробелы (пробел, табуляция, символы новой строки и т.п.) с конца строки.

Метод .replace() заменяет первый агрумент на второй. С помощью него мы убираем скобки.

```
fp = open('zapis3.txt')
         
for stroka in fp:
    stroka = stroka.rstrip('\n')
    stroka = stroka.replace('[', '')
    stroka = stroka.replace(']', '')
    K = stroka.split(',')
    for i in K:
        chislo = int(i)
        sps1.append(chislo)

fp.close()

sps1
         
>> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
```

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

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

```
fp=open('zapis3.txt')    
stroka1=fp.read(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() считывает одну строку из файла за один вызов. Он читает символы до тех пор,
пока не встретит символ новой строки или конец файла.
Если файл содержит только одну строку или указатель чтения находится в конце файла, то при
вызове readline() будет возвращена пустая строка.

```
fp = open('zapis3.txt')        
a = fp.readline()       
b = fp.readline()        
fp.close()
            
a        
>> '[1, 2, 3, 4]\n'
b
>> '[5, 6, 7, 8]\n'

fp=open('zapis3.txt')
s = fp.readlines()
s
>> ['[1, 2, 3, 4]\n', '[5, 6, 7, 8]\n', '[9, 10, 11, 12]\n']
```

## 4.9. Ввод-вывод объектов с использованием функций из модуля pickle.

Этот модуль предназначен для перевода объектов в бинарную форму.

```
import pickle
mnoz1={'pen','book','pen','iPhone','table','book'}
fp=open('zapis6.mnz','wb')
pickle.dump(mnoz1,fp)
fp.close()
```

Откроем получившийся файл в текстовом редакторе:

![]ris4.png
Так происходит, потому что байты  не предназначены для текстового представления.
Они могут содержать символы, которые не могут быть  интерпретированы в рамках
текстовой кодировки.

```
fp=open('zapis6.mnz','rb')
mnoz2=pickle.load(fp)
fp.close()
mnoz2
>> {'pen', 'iPhone', 'table', 'book'}
mnoz1 == mnoz2 # автоматическое объединение повторяющихся объектов
>> True

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

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

Поток в python позволяет регулировать источники
ввода информации и то, куда её выводить. Всего их по умолчанию три:

sys.stdin — поток ввода 
sys.stdout — поток вывода
sys.stderr — поток ошибок 

```
import sys
vr_out=sys.stdout
fc=open('Stroka.txt','w') #Откроем файл вывода
sys.stdout=fc #Перенацеливаем стандартный поток вывода на файл
print('запись строки в файл') #Вывод теперь будет не на экран, а в файл
sys.stdout=vr_out  #Восстановление текущего потока
print('запись строки на экран') #Убеждаемся, что вывод на экран восстановился
>> запись строки на экран
fc.close()
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 #Не забыть вернуть стандартное назначение для потока ввода
```
