ShinkarenkoVA 1 месяц назад
Родитель a4e7c00d66
Сommit 59421477a0

@ -0,0 +1,411 @@
# Отчет по теме 6
Шинкаренко Варвара, А-02-23
## 1. Настроили рабочий каталог
```py
import os
os.chdir('C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6')
```
## 2. Вывод данных на экран дисплея.
### 2.1. Вывод в командной строке.
```py
stroka = 'Автоматизированная система управления'
stroka
'Автоматизированная система управления'
```
### 2.2 Вывод с использованием функции print
```py
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()
```
Если текст большой, можно расположить его в несколько строк:
```py
print(""" Здесь может выводиться
большой текст,
занимающий несколько строк""")
Здесь может выводиться
большой текст,
занимающий несколько строк
# Или переносить отдельные объекты, разделенные запятой:
print("Здесь может выводиться",
"большой текст,",
"занимающий несколько строк")
Здесь может выводиться большой текст, занимающий несколько строк
# B первом случае текст ровно такой, как он был введен. Во втором случае три выводимых объекта-строки перечисленны через запятую, и это работает как обычный print().
```
### 2.3. Вывод с использованием write объекта sys.stdout.
```py
import sys
sys.stdout.write("Функция write")
Функция write13
# Hужно указать вручную переход на следующую строку:
sys.stdout.write("Функция write\n")
Функция write
14
```
## 3. Ввод данных с клавиатуры.
```py
psw = input('Введите пароль:')
Введите пароль:jfhdjfhd333
psw
'jfhdjfhd333'
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(), они потом выполняются и результат выводится на экран. Строка имеет тип, соответствующий результату вычислений и задаваемый автоматически:
type(eval(input('введите выражение для расчета = ')))
введите выражение для расчета = math.log10(23/(1+math.exp(-3.24)))
<class 'float'>
```
## 4. Ввод-вывод при работе с файлами.
### 4.1. Функции для работы с путём к файлу.
```py
import os
os.getcwd()
'C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6'
shinkarenko = os.getcwd()
shinkarenko
'C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6'
# Сменим директорию и посмотрим, что смена произошла:
os.chdir('C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA5')
os.getcwd()
'C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA5'
# Создание каталога (mkdir)
os.mkdir('tma61')
os.chdir('C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6\\tma61')
os.getcwd()
'C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6\\tma61'
# Удаление каталога
os.rmdir('C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6\\tma61')
os.chdir('C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6\\tma61')
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
os.chdir('C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6\\tma61')
FileNotFoundError: [WinError 2] Не удается найти указанный файл: 'C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6\\tma61'
# Показать список всех файлов и папок, вложенных в текущую
os.listdir()
['.gitkeep', 'TEMA6report.md', 'TEMA6task.md']
# Проверка существования каталога
os.path.isdir('tma61')
False
# Возвращение абсолютного пути
fil = os.path.abspath('TEMA6report.md')
fil
'C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6\\TEMA6report.md'
# Отделение из абсолютного пути только каталога/только имени файла
drkt = os.path.dirname(fil)
drkt
'C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6'
os.path.basename(fil)
'TEMA6report.md'
# Разделение на кортеж из пути и из имени файла
os.path.split(fil)
('C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6', 'TEMA6report.md')
# Проверка существования любого объекта
os.path.exists('C:\\Users')
True
os.path.exists('C:\\CatsandDogs')
False
# Проверка существования файла
os.path.isfile('C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6\\TEMA6report.md')
True
os.path.isfile('C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6\\RockandRoll.txt')
False
```
### 4.2 Общая схема работы с файлом
Для обмена данными с файлом необходимо выполнить следующие операции:
• Открытие файла с указанием его имени и цели (чтение, запись, добавление данных);
• Выполнение одной или нескольких операций обмена данными с файлом;
• Закрытие файла.
### 4.3 Открытие файла для записи или чтения
```py
fp = open(file = drkt+'\\zapis1.txt', mode='w')
type(fp)
<class '_io.TextIOWrapper'>
fp
<_io.TextIOWrapper name='C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6\\zapis1.txt' mode='w' encoding='cp1251'>
ddir(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']
# Oткрытиe бинарного файла:
fp1 = open(drkt + '\\zapis2.bin', mode = 'wb+')
fp1
<_io.BufferedRandom name='C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6\\zapis2.bin'>
```
### 4.4. Закрытие файла.
```py
# После закрытия на объект все еще можно посмотреть:
fp1.close()
fp1
<_io.BufferedRandom name='C:\\Users\\LENOVO\\Desktop\\python-labs\\TEMA6\\zapis2.bin'>
```
### 4.5. Запись информации в файл.
```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')
13
fp2.write(str(sps[4:8]) + '\n')
13
fp2.write(str(sps[8:]) + '\n')
16
fp2.close()
# B текстовом редакторе zapis3.txt:
[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
gh.close()
>>> gh = open('zapis5.txt','w')
>>> for r in sps3: gh.write(r[0]+' '+str(r[1])+'\n')
12
12
13
>>> gh.close()
# В текстовом редакторе:
Иванов И. 1
Петров П. 2
Сидоров С. 3
```
### 4.6. Чтение из файла, способ 1.
```py
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']
# Полученный список отличается от исходного 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]
```
### 4.7. Чтение информации из файла с помощью метода read.
Этой функции передается количество символов или, если открыт бинарный файл, - количество байт, которое должно быть прочитано, соответственно, из текстового или бинарного файла, начиная с текущего положения маркера. Если указать число большее, чем длина файла, или любое отрицательное, или не передавать вообще, будет прочитан весь файл до EOF.
```py
fp = open('zapis3.txt')
stroka1 = fp.read(12) # Чтение первых 12 файлов, курсор остановится на 13-ом (/n)
stroka2 = fp.read() # Чтение всех оставшихся файлов вплоть до EOF
fp.close()
stroka1
'[1, 2, 3, 4]'
stroka2
'\n[5, 6, 7, 8]\n[9, 10, 11, 12]\n'
```
### 4.8. Чтение информации с помощью readline и readlines.
Метод readline() считывает одну строку из файла за один вызов. Он читает символы до тех пор, пока не встретит символ новой строки (\n; включается в строку) или конец файла (EOF).
Если файл содержит только одну строку или указатель чтения находится в конце файла, то при
вызове readline() будет возвращена пустая строка.
Метод readlines() считывает все строки файла и возвращает их в виде списка, где каждая
строка — это отдельный элемент списка. Каждая строка в списке будет содержать символ новой
строки \n, если он есть в файле.
```py
file = open("zapis5.txt")
file.readline()
'Иванов И. 1\n'
file.seek(0) # Вовзращение указателя обратно в начало, чтобы нагляднее выполнить readlines
0
file.readlines()
['Иванов И. 1\n', 'Петров П. 2\n', 'Сидоров С. 3\n']
```
### 4.9. Ввод-вывод объектов с использованием функций из модуля pickle.
Этот модуль предназначен для сериализации (перевода в бинарную форму) объектов.
```py
import pickle
mnoz1={'pen','book','pen','iPhone','table','book'}
fp = open('zapis6.mnz', 'wb')
pickle.dump(mnoz1,fp)
fp.close()
# Откроем получившийся файл в текстовом редакторе, увидим подобную строку.
Ђ•# Џ”(ЊiPhone”Њpen”Њtable”Њbook”ђ.
```
Так происходит, потому что байты в этом файле не предназначены для текстового представления.Они могут содержать символы, которые не могут быть корректно интерпретированы в рамках любой текстовой кодировки. Но в некоторых байтах содержатся символы, которые попадают в диапазон, поддерживаемый текстовым редактором и конкретной кодировкой (в моем случае ANSI), поэтому правильно дешифрованные буквы все же есть. Десериализуем множество обратно:
```py
fp = open('zapis6.mnz','rb')
mnoz2 = pickle.load(fp)
fp.close()
mnoz2
{'iPhone', 'pen', 'table', 'book'}
mnoz1
{'iPhone', 'pen', 'table', 'book'}
mnoz1 == mnoz2
True
# mnoz1 не совпадает с тем, что было задано, потому что это множество. Оно исключает повторяющиеся элементы, оставляя только один, а еще не содержит конкретный порядок элементов. Но два множества равны, если у них равны все элементы и их одинаковое количество, вне зависимости от порядка, так что сравнение возвращает 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
{'iPhone', 'pen', 'table', 'book'}
obj2
[['Иванов И.', 1], ['Петров П.', 2], ['Сидоров С.', 3]]
mnoz1 == obj1
True
obj2 == sps3
True
```
## 5. Перенаправление потоков ввода и вывода данных.
```py
# Сохраним адрес в памяти текущего потока вывода:
import sys
vr_out = sys.stdout
fc = open('Stroka.txt','w')
sys.stdout = fc
print('запись строки в файл')
sys.stdout = vr_out
rint('запись строки на экран')
Traceback (most recent call last):
File "<pyshell#118>", line 1, in <module>
rint('запись строки на экран')
NameError: name 'rint' is not defined. Did you mean: 'print'?
print('запись строки на экран')
запись строки на экран
fc.close()
# В файле Stroka.txt: запись строки в файл
# Можно перенаправить и поток ввода тоже. Например, на файл:
while True:
try:
line = input()
print(line)
except EOFError:
break
запись строки в файл
fd.close()
sys.stdin = tmp_in
```
Загрузка…
Отмена
Сохранить