33 KiB
Отчет по теме 6
Цель работы: Научиться работать с файловым устройством в качестве накопителя или источника данных для проведения расчетов.
Терехов Фёдор Валерьевич, А-01-23
1. Вывод данных на экран дисплея.
1.1. Вывод с использованием функции print.
Этот способ можно применять и в командной строке, и в функциях, поэтому привыкайте использовать только его! По умолчанию вывод будет осуществляться на экран, но, как увидим дальше, пункт назначения выводимых данных можно переопределить.
fff=234.5;gg='Значение температуры = '
print(gg, fff)
Ответ программы:
Значение температуры = 234.5
По умолчанию выводимые объекты разделяются одним пробелом. Если нужен другой разделитель его можно указать в отдельном аргументе sep.
fff=234.5;gg='Значение температуры = '
print(gg, fff)
print(gg, fff, sep='/')
Ответ программы:
Значение температуры = 234.5
Значение температуры = /234.5
После вывода автоматически осуществляется переход на другую строку. Если курсор надо оставить в той же строке, то следует использовать еще один аргумент.
fff=234.5;gg='Значение температуры = '
print(gg, fff)
print(gg, fff, sep='/')
print(gg, fff,sep='/',end='***'); print('____')
Ответ программы:
Значение температуры = 234.5
Значение температуры = /234.5
Значение температуры = /234.5***____
После end= надо указать какими символами должна закончиться выводимая строка или указать пустую строку. Наоборот, если в какой-то момент требуется просто перейти на новую строку, можно использовать такое обращение к функции.
print()
Наконец, оператор вывода может располагаться на нескольких строках с использованием тройных кавычек.
print(""" Здесь может выводиться
большой текст,
занимающий несколько строк""")
print("Здесь может выводиться",
"большой текст,",
"занимающий несколько строк")
Ответ программы:
Здесь может выводиться
большой текст,
занимающий несколько строк
Здесь может выводиться большой текст, занимающий несколько строк
1.2. Вывод с использованием метода write объекта sys.stdout.
Объект stdout представляет собой поток стандартного вывода – объект, в который программы выводят символьное представление данных. Обычно это – экран дисплея. Объект находится в модуле sys, который надо импортировать.
import sys
sys.stdout.write('Функция write')
Ответ программы:
Функция write%
Обратите внимание, что этот метод после вывода строки не осуществляет переход на новую строку. Если это требуется, то следует в конце строки добавить один или несколько символов “\n”:
import sys
sys.stdout.write('Функция write\n')
Ответ программы:
Функция write
2. Ввод данных с клавиатуры.
2.1. Для ввода используйте уже знакомую функцию input.
psw=input('Введите пароль:')
print(psw)
print(type(psw))
Ответ программы:
Введите пароль:123
123
<class 'str'>
2.2. Ввод с контролем значения.
Пусть вводится число, которое должно находиться в интервале значений от 17.5 до 23.8.
while True:
znach=float(input('Задайте коэф.усиления = '))
if znach<17.5 or znach>23.8:
print('Ошибка!')
else:
break
Ответ программы:
Задайте коэф.усиления = 15.4
Ошибка!
Задайте коэф.усиления = 21.6
2.3. Ввод и обработка выражения, подлежащего расчету.
import math
print(eval(input('введите выражение для расчета = ')))
Ответ программы:
введите выражение для расчета = math.log10(23/(1+math.exp(-3.24)))
1.34504378689765
3. Ввод-вывод при работе с файлами.
Работа с файлом требует указания источника данных - полного имени файла с путем доступа к его расположению. Обычно наибольшие затруднения вызывает корректная локализация этого пути.
3.1. Функции для работы с путем к файлу.
Эти функции собраны в модуле os. Поэтому при работе с файлами надо импортировать этот модуль командой.Эти функции собраны в модуле os. Поэтому при работе с файлами надо импортировать этот модуль командой
import os
Как и в других системах, в среде Python в любой момент времени подразумевается некоторый рабочий каталог. Какой рабочий каталог установлен в текущий момент времени? Это можно узнать с помощью функции os.getcwd (cwd = current working directory).
os.getcwd()
Сохраните этот путь в переменной с именем, совпадающим с вашей фамилией в латинской транскрипции. Отобразите её значение с помощью функции print.
import os
TerekhovFV=os.getcwd()
print(TerekhovFV)
Ответ программы:
/Users/fedorterekhov/Library/Mobile Documents/com~apple~CloudDocs/Учёба/3 курс/POAS_labs/python-labs
Изменить расположение рабочего каталога можно обращением к уже многократно применявшейся функции os.chdir, аргументом которой будет символьная строка с указанием пути к каталогу, назначаемому в качестве рабочего.
import os
TerekhovFV=os.getcwd()
print(TerekhovFV)
os.chdir('/Users/fedorterekhov/Library')
print(os.getcwd())
Ответ программы:
/Users/fedorterekhov/Library/Mobile Documents/com~apple~CloudDocs/Учёба/3 курс/POAS_labs/python-labs
/Users/fedorterekhov/Library
Фунция os.mkdir(path) - создает новую директорию:
import os
os.mkdir('TEMA6/test_directory')
Фунция os.rmdir(path) - удаляет пустую директорию:
import os
os.rmdir('TEMA6/test_directory')
rmdir работает только с пустыми директориями! Для удаления непустых директорий нужно использовать shutil.rmtree().
Фунция os.listdir(path) - возвращает список файлов и директорий:
import os
print(os.listdir())
print(type(os.listdir()))
Ответ программы:
['TEMA4', 'TEMA3', 'TEMA2', 'TEMA5', 'README.md', '.gitignore', 'TEMA9', 'TEMA0', 'TEMA7', 'TEMA6', 'TEMA1', 'TEMA8', '.git']
<class 'list'>
Фунция os.path.isdir(path) - проверяет, является ли путь директорией:
import os
print(os.path.isdir('TEMA6/test_directory'))
print(os.path.isdir('TEMA6/images'))
print(type(os.path.isdir('TEMA6/test_directory')))
Ответ программы:
False
True
<class 'bool'>
С помощью функции os.path.abspath можно получить символьную строку, содержащую имя файла вместе с полным путем доступа к нему:
import os
fil=os.path.abspath("report.md")
print(fil)
Ответ программы:
/Users/fedorterekhov/Library/Mobile Documents/com~apple~CloudDocs/Учёба/3 курс/POAS_labs/python-labs/report.md
Выделить путь доступа к файлу из строки, содержащей и этот путь, и имя файла можно с помощью функции os.path.dirname:
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
print(drkt)
Ответ программы:
/Users/fedorterekhov/Library/Mobile Documents/com~apple~CloudDocs/Учёба/3 курс/POAS_labs/python-labs
Выделить имя файла/конечной директории из этой строки с отбрасыванием пути можно с помощью функции os.path.basename:
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
print(os.path.basename(drkt))
Ответ программы:
python-labs
Функция os.path.split разделяет путь к файлу или директории на корневую часть пути и имя файла или имя директории. Возвращает кортеж, содержащий два элемента:
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
print(os.path.split(drkt))
print(type(os.path.split(drkt)))
Ответ программы:
('/Users/fedorterekhov/Library/Mobile Documents/com~apple~CloudDocs/Учёба/3 курс/POAS_labs', 'python-labs')
<class 'tuple'>
С помощью функции os.path.exists можно проверить существует ли путь, заданный в символьной строке – аргументе функции. Возвращаемое значение: True или False.
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"))
Ответ программы:
True
False
Проверьте наличие файла с известным расположением с помощью функции os.path.isfile, аргументом которой должна быть символьная строка с путем и именем интересующего файла. Возвращаемое значение: True или False.
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"))
Ответ программы:
True
False
4. Общая схема работы с файлом.
Для обмена данными с файлом необходимо выполнить следующие операции:
- Открытие файла с указанием его имени и цели (чтение, запись, добавление данных);
- Выполнение одной или нескольких операций обмена данными с файлом;
- Закрытие файла.
4.1. Открытие файла для записи или чтения данных – функция open.
При открытии файла необходимо указать имя файлы (с путем, если он не в рабочем каталоге) и цель работы с ним. Для открытия используется функция open.
help(open)
Ответ программы:
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 для записи данных с помощью инструкции
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
fp=open(file=drkt+'/TEMA6/zapis1.txt',mode='w')
Здесь fp – это файловый объект, который в других языках программирования обычно называют файловой переменной. Он сохраняет ссылку на открываемый файл и позволяет в дальнейшем ссылаться на файл, не указывая путь и имя открытого файла. В аргументе функции с именем file указывается путь и имя открываемого файла, а в аргументе с именем mode – предполагаемая цель его использования (w=write – для записи).
Если путь в переменной drkt совпадает с рабочим каталогом, то его можно опустить, оставив только имя открываемого файла:
fp=open('zapis1.txt','w')
Тип и список атрибутов переменной fp:
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))
Ответ программы:
<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».
import os
fil=os.path.abspath("report.md")
drkt=os.path.dirname(fil)
fp1=open(drkt+'/TEMA6/zapis2.bin',mode='wb+')
В бинарный файл можно без преобразования записывать объекты любого типа.
Если файл – символьный, то его тип обозначается «t», но это – значение по умолчанию и его можно не указывать. В символьный файл можно записывать только объекты типа str. Объекты других типов надо перед записью преобразовать к этому типу.
4.2. Закрытие файла.
Сразу после завершения работы с файлом его следует закрыть для обеспечения сохранности его содержимого. Это делается с помощью метода close, применяемого к объекту – файловой переменной.
fp.close()
4.3. Запись информации в файл с помощью метода write.
Метод write относится к объекту – файловой переменной.
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]
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
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. Первый способ чтения.
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)
Ответ программы:
['1', ' 2', ' 3', ' 4', '5', ' 6', ' 7', ' 8', '9', ' 10', ' 11', ' 12']
В функции открытия файла использован только один аргумент, остальные – со значениями «по умолчанию».
Перед занесением строки в список с помощью метода rstrip, из неё удаляется символ конца строки, а с помощью метода replace – скобки.
Подумайте, как сделать так, чтобы список, полученный при чтении из файла, совпал с исходным.
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)
Ответ программы:
['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
5.2. Чтение информации из файла с помощью метода read.
Метод read, как и write, относится к объекту – файловой переменной. В качестве аргумента этого метода может задаваться целое число – количество символов или, если открыт бинарный файл, - количество байт, которое должно быть прочитано, соответственно, из текстового или бинарного файла, начиная с текущего положения маркера. Если указанное число превышает количество оставшихся символов (байт) в файле, то считываются все оставшиеся символы (байты). Если это число не указано, то считываются вся информация от маркера до конца файла. Метод возвращает строку с символами или совокупность байт, прочитанных из файла.
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)
Ответ программы:
1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]
5.3. Чтение информации с помощью методов readline и readlines.
Эти методы позволяют прочитать из файла, начиная с текущего положения маркера, соответственно, одну строку символов (совокупность байт) или все строки (все байты).
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)
Ответ программы:
[1, 2, 3, 4]
['[5, 6, 7, 8]\n', '[9, 10, 11, 12]\n']
6. Ввод-вывод объектов с использованием функций из модуля pickle.
В модуле pickle содержатся функции для работы с бинарными файлами, в которые могут последовательно записываться или считываться целиком один или несколько объектов из оперативной памяти.
6.1. Запись.
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()
6.2. Чтение.
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)
Ответ программы:
{'iPhone', 'table', 'pen', 'book'}
Объясните, почему он не совпадает с тем, что было задано при создании mnoz1. Инструкцией проверьте два объекта: mnoz1 и mnoz2 на совпадение.
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)
Ответ программы:
{'book', 'iPhone', 'table', 'pen'}
{'book', 'iPhone', 'table', 'pen'}
True
False
Почему порядок элементов отличается от исходного?
- Множество (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. При считывании объекты извлекаются из файла в той же последовательности, в которой они в него записывались.
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)
Ответ программы:
{'book', 'pen', 'iPhone', 'table'}
[['Иванов И.', 1], ['Петров П.', 2], ['Сидоров С.', 3]]
7. Перенаправление потоков ввода и вывода данных.
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()
Ответ программы:

Также на экран выведено сообщение:
запись строки на экран
Точно также можно перенаправить поток ввода – sys.stdin – вместо клавиатуры – из файла.
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
Ответ программы:
запись строки в файл




