ЛАБОРАТОРНАЯ РАБОТА №8

Тема: Работа с файлами на языке Python

Цель: Рассмотрение способов работы с файлами

ОГЛАВЛЕНИЕ

1 Работа с файлами
1.1 Открытие файла
1.2 Методы работы с файлами
1.3 Передача содержимого скрипта клиенту
1.4 Использование модуля os для работы с файловой системой
1.5 Использование модуля pickle для сериализации и консервации объектов
2 Обработка исключений
2.1 Типы исключений
2.2 Использование оператора try
2.3 Использование оператора raise
2.4 Использование функции/оператора assert
Пример №1
Индивидуальные задания

 Оглавление

1 Работа с файлами

В языке Python широко используются файлы для выполнения операций с данными, которые предполагается хранить длительное время. Для работы с файлами используется специальный объект файла, который содержит методы для чтения данных из файла и записи данных в файл.

 Оглавление

1.1 Открытие файла

Открыть файл можно с помощью встроенной функции open():

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

Функция открывает файл и возвращает соответствующий файловый объект для последующего оперирования с ним. Если файл не может быть открыт – вызывается исключение OSError:

Тип файла устанавливается при его открытии в соответствии с указанными значениями аргументов mode и buffering функции open():

Текстовые файлы отличаются тем, что содержат строки, осуществляют кодирование и декодирование символов и обработку символов новой строки.
Пример открытия текстового файла для записи:

>>> f= open ( 'text.txt' , 'w' )

Указав ссылку на файл, можно определить его параметры:

>>> f
<_io.TextIOWrapper name='text.txt' mode='w' encoding='cp1251'> ,

т.е. это:

 Оглавление

1.2 Методы работы с файлами

После создания текстового файла для работы с ним могут быть использованы следующие методы:

 Оглавление

1.3 Передача содержимого скрипта клиенту

Работа с текстовыми файлами на языке Python показана в небольшом клиент-серверном приложении, в котором сервер предоставляет пользователю тексты запрашиваемых скриптов.
Клиентская часть реализована в виде примера №1, в котором HTML-форма содержит поле ввода имени файла ("filename") и кнопки "Сброс" и "Получить файл":

 Оглавление

Пример №1

<!DOCTYPE html>
<html>
<head>
<title>Передача файла клиенту</title>
<link rel="stylesheet" href="file:///D:/!PYTHON/lab.css">
</head>
<body>
<h1>Передача файла клиенту</h1>
<form method="get" action="http://zykov/PYTHON/get_file_form.py">
Имя файла:
<input type="text" class="form" name="filename"><br><br>
<input type="reset" value="Сброс" class="kn">&nbsp;&nbsp;
<input type="submit" value="Получить файл" class="kn">
</form>
</body>
</html>

После ввода пользователем имени требуемого файла и нажатия кнопки "Получить файл" браузер передает введенное имя файла серверному приложению get_file_form.py:

#!c: . . . /Python35-32/python.exe
print ( "Content-Type: text/html\n" )
import cgi, cgitb, my_cgi
file=cgi.parse()[ "filename" ][0]
try :
f= open (file, encoding= "utf-8" )
print (my_cgi.H, "CGI: передача содержимого скрипта " ,file)
for el in f: my_cgi.D,el),
except FileNotFoundError : print (my_cgi.D, "Файл " , file, " не найден" ),

которое:

Если указать имя скрипта, который осуществляет приведенные выше действия, т.е. серверного приложения get_file_form.py, то клиент получит следующую Web-страницу, содержащую текст требуемого скрипта:

CGI: передача содержимого скрипта get_file_form.py

#!c:/ . . . Python35-32/python.exe

print("Content-Type: text/html\n")

import cgi, cgitb, my_cgi

file=cgi.parse()["filename"][0]

try :

f= open (file, encoding= "utf-8" )

print (my_cgi.H, "CGI: передача содержимого скрипта " ,file)

for el in f: my_cgi.D,el)

except FileNotFoundError : print (my_cgi.D, "Файл " , file, " не найден" ).

 Оглавление

1.4 Использование модуля os для работы с файловой системой

Модуль os имеет ряд методов, которые можно использовать для работы с файлами:

 Оглавление

1.5 Использование модуля pickle для сериализации и консервации объектов

Файлы в языке Python могут содержать или строки (текстовые файлы), или последовательности байтов (двоичные файлы). Чтобы сохранить в файле данные других типов, необходимо преобразовать их в строки (класс str) или в последовательности байтов (классы bytes и bytesarray). Это называется сериализацией объектов.
Модуль pickle содержит методы, позволяющие выполнить преобразование объектов разных типов и запись их в файлы:

Методы консервации pickle.dump() и деконсервации pickle.load() данных были использованы для сохранения и чтения набора тестов и словаря данных пользоваетеля при его тестировании (см. подразделы 2.2.2 и 2.2.3 лаб. раб. №10).

 Оглавление

2 Обработка исключений

В программах на языке Python могут возникнуть ошибки двух типов:

Если синтаксические ошибки могут обрабатываться только интерпретатором, то исключения могут быть обработаны также пользователем.

 Оглавление

2.1 Типы исключений

Python имеет следующие встроенные типы исключений:

 Оглавление

2.2 Использование оператора try

Для обработки исключений используется оператор try, который в общем случае имеет следующую структуру:

try:
<блок>
except <тип исключения>:
<блок>
[else:
<блок>]
[finally:
<блок>]

Отдельные части (секции) оператора try имеют следующее назначение:

В операторе try может быть указано несколько секций except, что позволяет обрабатывать несколько исключений независимо.
Приведем пример, в котором вводятся числа с клавиатуры и вычисляются их обратные значения. Поскольку при ошибке ввода или по незнанию может быть введено число 0 и возникнуть исключение деления на 0 (ZeroDivisionError), то для обработки этой ситуации используется оператор try:

>>> while True :
try :
c=1/ int ( input ( 'Введите число ' ))
print ( 'c= ' ,c)
break
except ZeroDivisionError :
print ( 'Ошибка: деление на 0' )
Введите число 0
Ошибка: деление на 0
Введите число 5
c= 0.2

После ввода нуля возникает и обрабатывается исключение ZeroDivisionError, сообщая пользователю об ошибке ввода. При повторном вводе числа на экран выводится его обратное значение – 0.2.
Использование оператора try для обнаружения и обработки исключения FileNotFoundError при открытии файла показано в подразделе 1.3 .

 Оглавление

2.3 Использование оператора raise

В языке Python имеется возможность вырабатывать исключения программно (в основном при отладке скриптов). Это делается с помощью оператора raise. Пвриведем пример его использования для генерации ислючения ZeroDivisionError, изменив предыдущий пример:

>>> try :
raise ZeroDivisionError
except ZeroDivisionError :
print ( 'Ошибка: деление на 0' )
Ошибка: деление на 0

 Оглавление

2.4 Использование функции/оператора assert

Для проверки правильности выполнения отдельных выражений может быть также использована функция assert() (для аналогичных целей может быть также применен оператор assert). Аргументом этой функции является выражение на языке Python, которое выражает некоторое условие. Функция проверяет это условие и, если оно не выполняется, генерирует исключение AssertionError.
В качестве примера использования функции assert рассмотрим тот же случай ввода чисел с клавиатуры и их анализ. Только на этот раз, чтобы соответствовать требованиям их дальнейшей обработки, числа должны быть больше нуля:

>>> try :
c= int ( input ( 'Введите число ' ))
assert (c>=0)
print ( 'c= ' ,c)
except AssertionError :
print ( 'Ошибка: введено отрицательное число' )
Введите число -4
Ошибка: введено отрицательное число

 Оглавление

Индивидуальные задания

Разработать приложение на базе технологии "клиент-сервер".
В задачи клиентской части входит: разработать HTML-документ, содержащий форму, обязательными элементами которой являются:

В задачи серверной части входит:

Таблица 1 – Параметры индивидуальных заданий

Номер
п/п
ДанныеМетоды ДлинаНомерСмещение ОткудаУсловие
записичтения
11, 2, 61320111701
21, 2, 722165712
31, 2, 8112520-423
41, 2, 923104604
51, 2, 1012126-115
61, 3, 6211814-1021
71, 3, 7131513602
81, 3, 8222412813
91, 3, 91182-224
101, 3, 10231481005
111, 4, 6122620-1211
121, 4, 72198-522
131, 4, 81319171403
141, 4, 922139314
151, 4, 10113015-2025
161, 5, 6231111001
171, 5, 712175-912
181, 5, 8212120-2023
191, 5, 91323101904
201, 5, 10222771215

 Оглавление