KEMBAR78
NTU KhPI PTM Programming Fundamentals_Py_07_файли.pptx
Робота з файлами в Python
Під час розв’язання задач на комп’ютері часто виникає необхідність у
використанні даних, які записані на зовнішніх носіях інформації (дисках)
і оформлені у вигляді файлів даних. Незалежно від того, які дані містять
файли (числа, символи, рядки, списки, множини, словники тощо), в мові
Python вони трактуються як потоки даних, які представляють собою
послідовність байтів, що зчитуються або записуються.
Файл – це іменований об'єкт, що зберігає однотипну інформацію
(програма або будь-яка інша інформація) на якомусь носії (флешка,
вінчестер).
Файли бувають двох видів: текстові та двійкові (бінарні).
Текстові файли – це послідовність символів (друковані символи і
пробіли), згрупована в рядки, які відокремлені один від одного
символами нового рядка (‘n’) .
Двійкові файли – це послідовність байтів, яка взаємно однозначно
відповідає байтам на зовнішньому пристрої, причому ніякого
перетворення символів не відбувається.
В Python операції з файлами виконуються в наступному порядку:
• відкрити файл;
• читання або запис;
• закрити файл.
2
Відкрити файл в Python
 В Python для відкриття файлів використовується метод open():
fileobj = open(filename, mode)
– fileobj – це об’єкт файлу (ім'я змінної), що повертається функцією open ();
– filename – це рядок, що представляє собою ім’я файлу (ім’я.розширення);
– mode – це рядок, який вказує на тип файлу і дії, які необхідно над ним зробити.
 Перша літера рядка mode вказує на операцію, друга літера рядка mode вказує на
тип файлу:
– t (або нічого) означає, що файл текстовий;
– b означає, що файл двійковий.
 Операції при роботі з файлами:
 Приклади, як відкрити файл у різних режимах:
file1 = open("test.txt“,’r’) # рівнозначний 'rt'
file1 = open("test.txt",'w') # запис у текстовому режимі
file1 = open("img.bmp",'r+b') # читання та запис у двійковому режимі
3
Методи для роботи з файлами в Python
4
Запис у файл в Python
 При записі у файл необхідно пам’ятати дві речі:
 Якщо ми намагаємося відкрити неіснуючий файл, створюється новий файл.
 Якщо файл уже існує, його вміст видаляється (!!!), а до файлу додається новий
вміст.
 Для того, щоб записати дані у файл в Python, потрібно відкрити його в режимі
запису, вказавши "w" у функції open() як другий аргумент.
 Функція write() – записує звичайний рядок в файл та повертає число записаних
байтів. Вона не додає ніяких пробілів або символів нового рядка, як це робить
функція print().
 Наприклад: lesson_file_for_DK
subjects='mathematics,physics,chemistry,informatics,English'
subject=' automatics'
# Запис рядка
file1=open('file_subjects.txt','w')
file1.write(subjects)
file1.write(subject)
file1.close()
 В результаті створиться файл file_subjects.txt:
mathematics,physics,chemistry,informatics,English automatics
 Функція writelines(lines) записує список рядків lines в файл і теж не додає ніяких
пробілів або символів нового рядка . Наприклад:
#Розбиття рядка на список за роздільниками
subject_list=subjects.split(',')
print('subject_list=',subject_list)
# запис списку рядків
file1=open('file_subject_list.txt','w')
file1.writelines(subject_list) # записує без роздільників
file1.close()
 В результаті створиться файл file_subject_list.txt:
5
 Щоб записати в файл список у вигляді
рядків потрібно використати ітератор.
Наприклад:
# 2 спосіб - запис списку рядків
file1=open('file_subject_list2.txt','w')
for el in subject_list:
file1.write(el+'n') # або writelines
file1.close()
# 3 спосіб - запис списку рядків
file1=open('file_subject_list3.txt','w')
for i in range(len(subject_list)):
file1.writelines(subject_list[i]+'n')
file1.close()
 За допомогою функції print() також
можна записувати дані в текстовий
файл :
# 4 спосіб - запис списку рядків функцією
print
file1=open('file_subject_list4.txt','w')
print(subject_list,file=file1) # записує як на
екрані
file1.close()
 В результаті створиться файл
file_subject_list2.txt:
mathematics
physics
chemistry
informatics
English
 В результаті створиться файл
file_subject_list3.txt:
mathematics
physics
chemistry
informatics
English
 В результаті створиться файл
file_subject_list4.txt:
['mathematics', 'physics', 'chemistry',
'informatics', 'English']
6
Читання файлів в Python
 Щоб повністю зчитати весь файл можна використати функцію read() без аргументів,
яка повертає тип str . Наприклад:
#Зчитування 1 спосіб
file1=open('file_subject_list2.txt','r')
list1=file1.read() #повертає тип str
file1.close()
print('list1=',list1,type(list1),'kod[sumbol 11]=',ord(list1[11]))
 Результат:
 Також можна зчитувати файл по одному рядку за раз за допомогою функції readline(),
яка теж повертає тип str . Наприклад:
#Зчитування 2 спосіб . Недолік - треба знати кількість рядків в файлі.
list2=[]
file1=open('file_subject_list2.txt','r')
for i in range(3):
el=file1.readline() #тип str
list2.append(el)
print('el=',el,type(el))
file1.close()
print('list2=',list2)
Результат:
7
 Простіший спосіб зчитати текстовий файл – використати ітератор, що буде
повертати по одному рядку за раз. Наприклад:
#Зчитування 3 спосіб Результат:
list3=[]
file1=open('file_subject_list2.txt','r')
for el in file1:
print(el,type(el))
list3.append(el) #тип str
file1.close()
print('list3=',list3)
 Найпростіший спосіб зчитати текстовий файл у вигляді списку рядків –
використати
функцію readlines(), яка повертає тип list. Наприклад:
#Зчитування 4 спосіб (найкоротший)
file1=open('file_subject_list2.txt','r')
list4=file1.readlines() #тип list
file1.close()
print('list4=',list4,type(list4))
 Результат:
8
Автоматичне закриття файлу (використання синтаксису with…as)
 Якщо забути закрити файл після роботи над ним, його закриє Python після того, як
буде видалено останнє посилання на нього. Це означає, що, якщо відкрити файл і не
закрити його явно, він буде закритий автоматично по завершенні функції. Але
можна відкрити файл всередині функції або навіть основного розділу програми.
Файл повинен бути закритий, щоб всі операції, що залишилися та записи були
завершені.
 У Python є менеджери контексту для очищення об’єктів на зразок відкритих файлів.
Можна використовувати синтаксис with...as для автоматичного закриття файлу:
 with вираз as змінна:
 Наприклад:
with open('file_subject_list2.txt','r') as file1:
for el in file1:
print(el)
 Після того як блок коду, розташований під менеджером контексту (в цьому випадку
цикл for), завершиться (або нормально, або шляхом генерації виключення), файл
буде закритий автоматично.
 Примітка: Оскільки в цьому варіанті не потрібно турбуватися про закриття файлу,
рекомендується завжди використовувати синтаксис with...as.
9
Винятки в Python
 Винятки – це сповіщення інтерпретатора, що виводяться в разі виникнення помилки в
програмному коді або при настанні якої-небудь події.
 Помилки, що виникають під час виконання програми (після проходження синтаксичної
перевірки), називаються винятками або логічними помилками.
 Наприклад, вони виникають в наступних ситуаціях:
- спроба відкрити неіснуючий файл — генерується виняток FileNotFoundError;
- спроба ділити на нуль — генерується виняток ZeroDivisionError;
- спроба імпортувати неіснуючий модуль — генерується виняток ImportError.
 При виникненні подібних помилок під час виконання Python створює об’єкт винятку.
Якщо в коді не передбачено оброблення винятків, то програма переривається і
виводиться повідомлення про помилку.
 Наприклад:
rez = 7 / 0
 Цей рядок згенерує виняток, тому що ділити на 0 не можна:
Traceback (most recent call last):
File "<string>", line 1, in <module>
ZeroDivisionError: division by zero
 У Python існує багато вбудованих винятків, які генеруються при виникненні
відповідних помилок.
Можна переглянути всі вбудовані винятки за допомогою функції local() наступним
чином:
print(dir(locals()['__builtins__']))
Тут locals()['__builtins__'] поверне модуль вбудованих винятків, функцій та атрибутів, а
dir дозволить перерахувати ці атрибути у вигляді рядків.
10
Найбільш поширені вбудовані винятки в Python
11
12
Обробка винятків в Python
 Винятки можуть у будь-який момент завершити виконання програми. Саме тому важливо
обробляти винятки. Для цього в Python використовується блок try...except.
Конструкція try…except в Python
 Синтаксис:
try:
# Код, який може згенерувати виняток
except:
# Код для виконання у разі генерації винятку
 Код, який може згенерувати виняток, знаходиться всередині блоку try. За кожним блоком
try слідує блок except. Коли виникає виняток, він перехоплюється блоком except.
 Наприклад: lesson_exceptions
try:
a = 10
b = 0
result = a/b
print(result)
except
print("Error: Denominator cannot be 0.")
 Результат:
Error: Denominator cannot be 0.
 У цьому прикладі ми намагаємось поділити число на 0. Через це генерується виняток. Щоб
обробити виняток, ми помістили код result = a/b всередині блоку try. Тепер, коли виникає
виняток, решта коду всередині блоку try пропускається.
 Блок except перехоплює виняток, і код всередині блоку except виконується. Якщо код у
блоці try не генерує виняток, блок except пропускається.
13
Перехоплення специфічних винятків в Python
 Для кожного блоку try може існувати від нуля і більше блоків except. Декілька
блоків except дозволяють обробляти кожен виняток по-різному.
 Тип аргументу кожного блоку except вказує на тип винятку, який може бути
оброблений цим блоком.
 Наприклад:
try:
list1 = [2,4,6,8]
print(list1[5])
except ZeroDivisionError:
print("Denominator cannot be 0.")
except IndexError:
print("Index Out of Bound.")
 Результат:
Error: Index Out of Bound
 Тут ми створили список з ім’ям list1 та намагаємося отримати доступ до елемента
під індексом 5. Отже, виникає виняток IndexError.
 Коли виняток IndexError виникає у блоці try:
1. виняток ZeroDivisionError пропускається;
2. виконується код всередині винятку IndexError.
14
Конструкція try з умовою else в Python
 У деяких ситуаціях може знадобитися виконати певний блок коду, якщо код всередині try
виконається без помилок. Для таких випадків використовується необов’язкове ключове
слово else разом з оператором try. Наприклад:
import math
try:
num = int(input("num= "))
except ValueError:
print("Not a number!")
else:
result=math.sqrt(num)
print('sqrt(num)=%.2f'%(result))
 Результат ( Якщо ввести не число):
num= dfg
Not a number!
 Результат ( Якщо ввести число>=0):
num= 7
sqrt(num)=2.65
 Результат ( Якщо ввести число<0):
 num= -7
Traceback (most recent call last):
File “string", line 27, in <module>
result=math.sqrt(num)
ValueError: math domain error
 Примітка: Винятки у блоці else не обробляються попередніми блоками except.
15
Конструкція try…finally в Python
 В Python блок finally виконується завжди, незалежно від того, генерується виняток
чи ні. Блок finally є необов’язковим. І для кожного блоку try може бути лише один
блок finally. Наприклад:
import math
try:
num = int(input("num= "))
result=math.sqrt(math.fabs(num))
result=round(result,3)
except ValueError:
result="Not a number!"
finally:
print('result=',result)
 Результат:
16
Обробка винятків у файлах
 Якщо під час виконання будь-якої операції з файлом виникає виняток, програма
завершує виконання, не закриваючи при цьому файли. Одним із рішень в цій
ситуації є використання блоку try...finally.
 Наприклад:
try:
file1 = open("test.txt", "r")
read_content = file1.read()
print(read_content)
finally:
# Закриваємо файл
file1.close()
 Тут ми закрили файл у блоці finally, оскільки блок finally завжди виконується, то
файл буде закритий, навіть якщо згенерується виняток.
17
Приклад 1
Програма реалізує запис матриці у файл та зчитування даних із файлу з подальшою обробкою lesson_file_r_w
import random
n=int(input('n='))
m=int(input('m='))
try:
file1=open('1.txt','w')
for i in range(n):
for j in range(m):
x=random.randint(60,100)
file1.write(str(x)+' ')
file1.write('n')
finally:
file1.close()
#Зчитування 1 спосіб
file1=open('1.txt','r')
list1=file1.readlines() #тип list
file1.close()
print('list1=',list1,type(list1))
#Зчитування 2 спосіб
list2=[]
file1=open('1.txt','r')
for i in file1:
list2.append(i) #тип str
print(i,type(i))
file1.close()
print('list2=',list2)
#Зчитування 3 спосіб
list3=[]
file1=open('1.txt','r')
for i in range(n):
i=file1.readline() #тип str
list3.append(i)
file1.close()
print('list3=',list3)
Результат:
18
Продовження прикладу 1
#Перетворення списку рядків list1 в матрицю mas2
mas2=[]
for i in range(len(list1)):
num=list1[i].split()
mas2.append(num)
print('mas2=',mas2)
#Обчислення середнього для кожного стовпця
S_list=[]
for j in range(m):
s=0
for i in range(n):
s+=int(mas2[i][j])
s/=n
S_list.append(int(s))
print('S_list=',S_list)
#Дописуємо в файл середнє під кожним стовпцем
file1=open('1.txt','a')
for i in S_list:
file1.write(str(i)+' ')
file1.write('middle ball')
file1.close()
 Результат (продовження):
19
Приклад 2
Надано текстовий файл file_tel_1.txt зі списком прізвищ і відповідних номерів
телефонів:
Програма реалізує зчитування інформації з файлу, сортування списку абонентів за
алфавітом, який записує в файл file_tel_sort.txt, і виводить номер телефону
запитуваного абонента.
20
#Зчитування списку абонентів file_tel
try:
file1=open('file_tel_1.txt','r')
list1=file1.readlines()
finally:
file1.close()
for el in list1:
print(el,end='')
#Перетворення списку рядків list1 в список
#словників з ключами 'name', 'tel'
abonents=[]
for i in range(len(list1)):
ab=list1[i].split(';')
#Видаляємо n методом rstrip('n')
abonent={'name':ab[0],'tel':ab[1].rstrip('n')}
abonents.append(abonent)
#Сортування абонентів за ім'ям
sort=sorted(abonents,key=lambda el:el['name'])
print('nSorted:')
#Запис абонентів в інший файл
try:
file1=open('file_tel_sort.txt','w')
for el in sort:
print(el['name'].ljust(20),el['tel'],sep=';',file=file1)
print(el['name'].ljust(20),el['tel'],sep=';')
finally:
file1.close()
#Виведення номера телефону запитуваного абонента
ab=input('Input name of abonent=')
ab=ab.capitalize()
for el in sort:
if el['name'].startswith(ab):
print(el['name'],'tel: ',el['tel'])
21
Приклад 3
 Надано текстовий файл, ім'я якого вводить користувач, зі списком прізвищ студентів і відповідних
оцінок. Програма реалізує зчитування інформації з файлу, сортування списку за середнім балом, який
записує у файл результатів.
#Зчитування з файлу списку студентів за форматом: прізвище оцінки
# Name 95 95 95 95 95 95 95 95
file_name=input('Name of input file=') # sort1.txt
try:
file1=open(file_name,'r')
sp=file1.readlines()
except FileNotFoundError:
print('No such file!!!')
finally:
file1.close()
print(sp)
kstud=len(sp) #кількість студентів
print('kstud=%d'%(kstud))
#Перетворення кожного рядка файлу в список
for istud in range(kstud):
list_s=sp[istud].split()
print(list_s)
#Обчислення середнього балу кожного студента
koc=len(list_s) #кількість оцінок
s=0
for i in range(1,koc):
s+=float(list_s[i])
s/=(koc-1)
#додаємо у поточний рядок середній бал (останній елемент)
list_s.append(round(s,2))
sp[istud]=list_s
#Виведення списку студентів
print(' ')
for i in sp:
print(i)
22
#Сортування списку за середнім балом (останнім елементом)
#Використана функція lambda el:el[-1]
sp.sort(key=lambda el:el[-1],reverse=True)
print('nReiting as list')
for i in sp:
print(i)
#Перетворення списку sp в список рядків
rez_sp=[]
for i in range(len(sp)):
#sp[i][len(sp[i])-1]=str(sp[i][len(sp[i])-1]) або
sp[i][-1]=str(sp[i][-1])
rez_sp.append(', '.join(sp[i]))
#Виведення списку рядків')
print('nReiting as string')
for i in rez_sp:
print(i)
#Запис списку в файл
file1=open('sort_rez.txt','w')
for i in rez_sp:
file1.writelines(i+'n')
file1.close()
23
Приклад 4
 Надано текстовий файл, ім'я якого вводить користувач, з інформацією за форматом.
Програма реалізує зчитування інформації з файлу, сортування списку за рейтинговим балом, який
записує у файл результатів.
# Використання словарів для сортування студентів за рейтингом
# Зчитування списку з файлу, наприклад sort_dict1.txt
# Функція зчитування з файлу - в тип dict
def file_read_stud(file_in):
try:
file1=open(file_name,'r')
l=file1.readlines()
except FileNotFoundError:
print('No such file!!!')
finally:
file1.close()
dic_stud={}
for i in range(1,len(l)):
stud=l[i].split()
d={'name':stud[0],'gr':stud[1],'ad_bal':int(stud[2])}
grades=[]
for ioc in range(3,len(stud)-1,2):
grades.append({'kr':int(stud[ioc]),'grade':int(stud[ioc+1])})
d['grades']=grades
dic_stud[i]=d
return dic_stud
file_name=input('Name of input file=')
sp=file_read_stud(file_name)
#Виведення зчитаних даних (тип dict)
print(sp)
24
# виведення назв
for key in sp[1]:
print(key.center(10),end=' ') #вирівнювання рядка по центру
print('')
# виведення i- номер студента, j- ключ даних кожного студента
for i,stud in sp.items():
print(i,end='.')
for j,value in stud.items():
if j!='grades':
print(str(value).ljust(10),end=' ') #вирівнювання рядка по лівому краю
elif j=='grades':
for ioc in range(len(value)):
print('{:d} {:d}'.format(value[ioc]['kr'],value[ioc]['grade']),end=' ')
print()
print()
25
# Обчислення рейтингового балу
for i in sp:
rb=skr=0
for ioc in range(len(sp[i]['grades'])):
rb+=sp[i]['grades'][ioc]['kr']*sp[i]['grades'][ioc]['grade']
skr+=sp[i]['grades'][ioc]['kr']
sp[i]['bal']=round(rb/skr*0.9,2)+sp[i]['ad_bal']
#Сортування за рейтинговим балом, результат - список sort_sp
sort_sp=sorted(sp.values(),key=lambda el:el['bal'],reverse=True)
#Запис списку в файл
file1=open('sort_dict1_rez.txt','w')
for i in sort_sp:
print(i['name'],'t',i['gr'],'t',i['bal'])
file1.write(i['name']+'t'+i['gr']+'t'+str(i['bal'])+'n')
file1.close()

NTU KhPI PTM Programming Fundamentals_Py_07_файли.pptx

  • 1.
    Робота з файламив Python Під час розв’язання задач на комп’ютері часто виникає необхідність у використанні даних, які записані на зовнішніх носіях інформації (дисках) і оформлені у вигляді файлів даних. Незалежно від того, які дані містять файли (числа, символи, рядки, списки, множини, словники тощо), в мові Python вони трактуються як потоки даних, які представляють собою послідовність байтів, що зчитуються або записуються. Файл – це іменований об'єкт, що зберігає однотипну інформацію (програма або будь-яка інша інформація) на якомусь носії (флешка, вінчестер). Файли бувають двох видів: текстові та двійкові (бінарні). Текстові файли – це послідовність символів (друковані символи і пробіли), згрупована в рядки, які відокремлені один від одного символами нового рядка (‘n’) . Двійкові файли – це послідовність байтів, яка взаємно однозначно відповідає байтам на зовнішньому пристрої, причому ніякого перетворення символів не відбувається. В Python операції з файлами виконуються в наступному порядку: • відкрити файл; • читання або запис; • закрити файл.
  • 2.
    2 Відкрити файл вPython  В Python для відкриття файлів використовується метод open(): fileobj = open(filename, mode) – fileobj – це об’єкт файлу (ім'я змінної), що повертається функцією open (); – filename – це рядок, що представляє собою ім’я файлу (ім’я.розширення); – mode – це рядок, який вказує на тип файлу і дії, які необхідно над ним зробити.  Перша літера рядка mode вказує на операцію, друга літера рядка mode вказує на тип файлу: – t (або нічого) означає, що файл текстовий; – b означає, що файл двійковий.  Операції при роботі з файлами:  Приклади, як відкрити файл у різних режимах: file1 = open("test.txt“,’r’) # рівнозначний 'rt' file1 = open("test.txt",'w') # запис у текстовому режимі file1 = open("img.bmp",'r+b') # читання та запис у двійковому режимі
  • 3.
    3 Методи для роботиз файлами в Python
  • 4.
    4 Запис у файлв Python  При записі у файл необхідно пам’ятати дві речі:  Якщо ми намагаємося відкрити неіснуючий файл, створюється новий файл.  Якщо файл уже існує, його вміст видаляється (!!!), а до файлу додається новий вміст.  Для того, щоб записати дані у файл в Python, потрібно відкрити його в режимі запису, вказавши "w" у функції open() як другий аргумент.  Функція write() – записує звичайний рядок в файл та повертає число записаних байтів. Вона не додає ніяких пробілів або символів нового рядка, як це робить функція print().  Наприклад: lesson_file_for_DK subjects='mathematics,physics,chemistry,informatics,English' subject=' automatics' # Запис рядка file1=open('file_subjects.txt','w') file1.write(subjects) file1.write(subject) file1.close()  В результаті створиться файл file_subjects.txt: mathematics,physics,chemistry,informatics,English automatics  Функція writelines(lines) записує список рядків lines в файл і теж не додає ніяких пробілів або символів нового рядка . Наприклад: #Розбиття рядка на список за роздільниками subject_list=subjects.split(',') print('subject_list=',subject_list) # запис списку рядків file1=open('file_subject_list.txt','w') file1.writelines(subject_list) # записує без роздільників file1.close()  В результаті створиться файл file_subject_list.txt:
  • 5.
    5  Щоб записатив файл список у вигляді рядків потрібно використати ітератор. Наприклад: # 2 спосіб - запис списку рядків file1=open('file_subject_list2.txt','w') for el in subject_list: file1.write(el+'n') # або writelines file1.close() # 3 спосіб - запис списку рядків file1=open('file_subject_list3.txt','w') for i in range(len(subject_list)): file1.writelines(subject_list[i]+'n') file1.close()  За допомогою функції print() також можна записувати дані в текстовий файл : # 4 спосіб - запис списку рядків функцією print file1=open('file_subject_list4.txt','w') print(subject_list,file=file1) # записує як на екрані file1.close()  В результаті створиться файл file_subject_list2.txt: mathematics physics chemistry informatics English  В результаті створиться файл file_subject_list3.txt: mathematics physics chemistry informatics English  В результаті створиться файл file_subject_list4.txt: ['mathematics', 'physics', 'chemistry', 'informatics', 'English']
  • 6.
    6 Читання файлів вPython  Щоб повністю зчитати весь файл можна використати функцію read() без аргументів, яка повертає тип str . Наприклад: #Зчитування 1 спосіб file1=open('file_subject_list2.txt','r') list1=file1.read() #повертає тип str file1.close() print('list1=',list1,type(list1),'kod[sumbol 11]=',ord(list1[11]))  Результат:  Також можна зчитувати файл по одному рядку за раз за допомогою функції readline(), яка теж повертає тип str . Наприклад: #Зчитування 2 спосіб . Недолік - треба знати кількість рядків в файлі. list2=[] file1=open('file_subject_list2.txt','r') for i in range(3): el=file1.readline() #тип str list2.append(el) print('el=',el,type(el)) file1.close() print('list2=',list2) Результат:
  • 7.
    7  Простіший спосібзчитати текстовий файл – використати ітератор, що буде повертати по одному рядку за раз. Наприклад: #Зчитування 3 спосіб Результат: list3=[] file1=open('file_subject_list2.txt','r') for el in file1: print(el,type(el)) list3.append(el) #тип str file1.close() print('list3=',list3)  Найпростіший спосіб зчитати текстовий файл у вигляді списку рядків – використати функцію readlines(), яка повертає тип list. Наприклад: #Зчитування 4 спосіб (найкоротший) file1=open('file_subject_list2.txt','r') list4=file1.readlines() #тип list file1.close() print('list4=',list4,type(list4))  Результат:
  • 8.
    8 Автоматичне закриття файлу(використання синтаксису with…as)  Якщо забути закрити файл після роботи над ним, його закриє Python після того, як буде видалено останнє посилання на нього. Це означає, що, якщо відкрити файл і не закрити його явно, він буде закритий автоматично по завершенні функції. Але можна відкрити файл всередині функції або навіть основного розділу програми. Файл повинен бути закритий, щоб всі операції, що залишилися та записи були завершені.  У Python є менеджери контексту для очищення об’єктів на зразок відкритих файлів. Можна використовувати синтаксис with...as для автоматичного закриття файлу:  with вираз as змінна:  Наприклад: with open('file_subject_list2.txt','r') as file1: for el in file1: print(el)  Після того як блок коду, розташований під менеджером контексту (в цьому випадку цикл for), завершиться (або нормально, або шляхом генерації виключення), файл буде закритий автоматично.  Примітка: Оскільки в цьому варіанті не потрібно турбуватися про закриття файлу, рекомендується завжди використовувати синтаксис with...as.
  • 9.
    9 Винятки в Python Винятки – це сповіщення інтерпретатора, що виводяться в разі виникнення помилки в програмному коді або при настанні якої-небудь події.  Помилки, що виникають під час виконання програми (після проходження синтаксичної перевірки), називаються винятками або логічними помилками.  Наприклад, вони виникають в наступних ситуаціях: - спроба відкрити неіснуючий файл — генерується виняток FileNotFoundError; - спроба ділити на нуль — генерується виняток ZeroDivisionError; - спроба імпортувати неіснуючий модуль — генерується виняток ImportError.  При виникненні подібних помилок під час виконання Python створює об’єкт винятку. Якщо в коді не передбачено оброблення винятків, то програма переривається і виводиться повідомлення про помилку.  Наприклад: rez = 7 / 0  Цей рядок згенерує виняток, тому що ділити на 0 не можна: Traceback (most recent call last): File "<string>", line 1, in <module> ZeroDivisionError: division by zero  У Python існує багато вбудованих винятків, які генеруються при виникненні відповідних помилок. Можна переглянути всі вбудовані винятки за допомогою функції local() наступним чином: print(dir(locals()['__builtins__'])) Тут locals()['__builtins__'] поверне модуль вбудованих винятків, функцій та атрибутів, а dir дозволить перерахувати ці атрибути у вигляді рядків.
  • 10.
  • 11.
  • 12.
    12 Обробка винятків вPython  Винятки можуть у будь-який момент завершити виконання програми. Саме тому важливо обробляти винятки. Для цього в Python використовується блок try...except. Конструкція try…except в Python  Синтаксис: try: # Код, який може згенерувати виняток except: # Код для виконання у разі генерації винятку  Код, який може згенерувати виняток, знаходиться всередині блоку try. За кожним блоком try слідує блок except. Коли виникає виняток, він перехоплюється блоком except.  Наприклад: lesson_exceptions try: a = 10 b = 0 result = a/b print(result) except print("Error: Denominator cannot be 0.")  Результат: Error: Denominator cannot be 0.  У цьому прикладі ми намагаємось поділити число на 0. Через це генерується виняток. Щоб обробити виняток, ми помістили код result = a/b всередині блоку try. Тепер, коли виникає виняток, решта коду всередині блоку try пропускається.  Блок except перехоплює виняток, і код всередині блоку except виконується. Якщо код у блоці try не генерує виняток, блок except пропускається.
  • 13.
    13 Перехоплення специфічних винятківв Python  Для кожного блоку try може існувати від нуля і більше блоків except. Декілька блоків except дозволяють обробляти кожен виняток по-різному.  Тип аргументу кожного блоку except вказує на тип винятку, який може бути оброблений цим блоком.  Наприклад: try: list1 = [2,4,6,8] print(list1[5]) except ZeroDivisionError: print("Denominator cannot be 0.") except IndexError: print("Index Out of Bound.")  Результат: Error: Index Out of Bound  Тут ми створили список з ім’ям list1 та намагаємося отримати доступ до елемента під індексом 5. Отже, виникає виняток IndexError.  Коли виняток IndexError виникає у блоці try: 1. виняток ZeroDivisionError пропускається; 2. виконується код всередині винятку IndexError.
  • 14.
    14 Конструкція try зумовою else в Python  У деяких ситуаціях може знадобитися виконати певний блок коду, якщо код всередині try виконається без помилок. Для таких випадків використовується необов’язкове ключове слово else разом з оператором try. Наприклад: import math try: num = int(input("num= ")) except ValueError: print("Not a number!") else: result=math.sqrt(num) print('sqrt(num)=%.2f'%(result))  Результат ( Якщо ввести не число): num= dfg Not a number!  Результат ( Якщо ввести число>=0): num= 7 sqrt(num)=2.65  Результат ( Якщо ввести число<0):  num= -7 Traceback (most recent call last): File “string", line 27, in <module> result=math.sqrt(num) ValueError: math domain error  Примітка: Винятки у блоці else не обробляються попередніми блоками except.
  • 15.
    15 Конструкція try…finally вPython  В Python блок finally виконується завжди, незалежно від того, генерується виняток чи ні. Блок finally є необов’язковим. І для кожного блоку try може бути лише один блок finally. Наприклад: import math try: num = int(input("num= ")) result=math.sqrt(math.fabs(num)) result=round(result,3) except ValueError: result="Not a number!" finally: print('result=',result)  Результат:
  • 16.
    16 Обробка винятків уфайлах  Якщо під час виконання будь-якої операції з файлом виникає виняток, програма завершує виконання, не закриваючи при цьому файли. Одним із рішень в цій ситуації є використання блоку try...finally.  Наприклад: try: file1 = open("test.txt", "r") read_content = file1.read() print(read_content) finally: # Закриваємо файл file1.close()  Тут ми закрили файл у блоці finally, оскільки блок finally завжди виконується, то файл буде закритий, навіть якщо згенерується виняток.
  • 17.
    17 Приклад 1 Програма реалізуєзапис матриці у файл та зчитування даних із файлу з подальшою обробкою lesson_file_r_w import random n=int(input('n=')) m=int(input('m=')) try: file1=open('1.txt','w') for i in range(n): for j in range(m): x=random.randint(60,100) file1.write(str(x)+' ') file1.write('n') finally: file1.close() #Зчитування 1 спосіб file1=open('1.txt','r') list1=file1.readlines() #тип list file1.close() print('list1=',list1,type(list1)) #Зчитування 2 спосіб list2=[] file1=open('1.txt','r') for i in file1: list2.append(i) #тип str print(i,type(i)) file1.close() print('list2=',list2) #Зчитування 3 спосіб list3=[] file1=open('1.txt','r') for i in range(n): i=file1.readline() #тип str list3.append(i) file1.close() print('list3=',list3) Результат:
  • 18.
    18 Продовження прикладу 1 #Перетвореннясписку рядків list1 в матрицю mas2 mas2=[] for i in range(len(list1)): num=list1[i].split() mas2.append(num) print('mas2=',mas2) #Обчислення середнього для кожного стовпця S_list=[] for j in range(m): s=0 for i in range(n): s+=int(mas2[i][j]) s/=n S_list.append(int(s)) print('S_list=',S_list) #Дописуємо в файл середнє під кожним стовпцем file1=open('1.txt','a') for i in S_list: file1.write(str(i)+' ') file1.write('middle ball') file1.close()  Результат (продовження):
  • 19.
    19 Приклад 2 Надано текстовийфайл file_tel_1.txt зі списком прізвищ і відповідних номерів телефонів: Програма реалізує зчитування інформації з файлу, сортування списку абонентів за алфавітом, який записує в файл file_tel_sort.txt, і виводить номер телефону запитуваного абонента.
  • 20.
    20 #Зчитування списку абонентівfile_tel try: file1=open('file_tel_1.txt','r') list1=file1.readlines() finally: file1.close() for el in list1: print(el,end='') #Перетворення списку рядків list1 в список #словників з ключами 'name', 'tel' abonents=[] for i in range(len(list1)): ab=list1[i].split(';') #Видаляємо n методом rstrip('n') abonent={'name':ab[0],'tel':ab[1].rstrip('n')} abonents.append(abonent) #Сортування абонентів за ім'ям sort=sorted(abonents,key=lambda el:el['name']) print('nSorted:') #Запис абонентів в інший файл try: file1=open('file_tel_sort.txt','w') for el in sort: print(el['name'].ljust(20),el['tel'],sep=';',file=file1) print(el['name'].ljust(20),el['tel'],sep=';') finally: file1.close() #Виведення номера телефону запитуваного абонента ab=input('Input name of abonent=') ab=ab.capitalize() for el in sort: if el['name'].startswith(ab): print(el['name'],'tel: ',el['tel'])
  • 21.
    21 Приклад 3  Наданотекстовий файл, ім'я якого вводить користувач, зі списком прізвищ студентів і відповідних оцінок. Програма реалізує зчитування інформації з файлу, сортування списку за середнім балом, який записує у файл результатів. #Зчитування з файлу списку студентів за форматом: прізвище оцінки # Name 95 95 95 95 95 95 95 95 file_name=input('Name of input file=') # sort1.txt try: file1=open(file_name,'r') sp=file1.readlines() except FileNotFoundError: print('No such file!!!') finally: file1.close() print(sp) kstud=len(sp) #кількість студентів print('kstud=%d'%(kstud)) #Перетворення кожного рядка файлу в список for istud in range(kstud): list_s=sp[istud].split() print(list_s) #Обчислення середнього балу кожного студента koc=len(list_s) #кількість оцінок s=0 for i in range(1,koc): s+=float(list_s[i]) s/=(koc-1) #додаємо у поточний рядок середній бал (останній елемент) list_s.append(round(s,2)) sp[istud]=list_s #Виведення списку студентів print(' ') for i in sp: print(i)
  • 22.
    22 #Сортування списку засереднім балом (останнім елементом) #Використана функція lambda el:el[-1] sp.sort(key=lambda el:el[-1],reverse=True) print('nReiting as list') for i in sp: print(i) #Перетворення списку sp в список рядків rez_sp=[] for i in range(len(sp)): #sp[i][len(sp[i])-1]=str(sp[i][len(sp[i])-1]) або sp[i][-1]=str(sp[i][-1]) rez_sp.append(', '.join(sp[i])) #Виведення списку рядків') print('nReiting as string') for i in rez_sp: print(i) #Запис списку в файл file1=open('sort_rez.txt','w') for i in rez_sp: file1.writelines(i+'n') file1.close()
  • 23.
    23 Приклад 4  Наданотекстовий файл, ім'я якого вводить користувач, з інформацією за форматом. Програма реалізує зчитування інформації з файлу, сортування списку за рейтинговим балом, який записує у файл результатів. # Використання словарів для сортування студентів за рейтингом # Зчитування списку з файлу, наприклад sort_dict1.txt # Функція зчитування з файлу - в тип dict def file_read_stud(file_in): try: file1=open(file_name,'r') l=file1.readlines() except FileNotFoundError: print('No such file!!!') finally: file1.close() dic_stud={} for i in range(1,len(l)): stud=l[i].split() d={'name':stud[0],'gr':stud[1],'ad_bal':int(stud[2])} grades=[] for ioc in range(3,len(stud)-1,2): grades.append({'kr':int(stud[ioc]),'grade':int(stud[ioc+1])}) d['grades']=grades dic_stud[i]=d return dic_stud file_name=input('Name of input file=') sp=file_read_stud(file_name) #Виведення зчитаних даних (тип dict) print(sp)
  • 24.
    24 # виведення назв forkey in sp[1]: print(key.center(10),end=' ') #вирівнювання рядка по центру print('') # виведення i- номер студента, j- ключ даних кожного студента for i,stud in sp.items(): print(i,end='.') for j,value in stud.items(): if j!='grades': print(str(value).ljust(10),end=' ') #вирівнювання рядка по лівому краю elif j=='grades': for ioc in range(len(value)): print('{:d} {:d}'.format(value[ioc]['kr'],value[ioc]['grade']),end=' ') print() print()
  • 25.
    25 # Обчислення рейтинговогобалу for i in sp: rb=skr=0 for ioc in range(len(sp[i]['grades'])): rb+=sp[i]['grades'][ioc]['kr']*sp[i]['grades'][ioc]['grade'] skr+=sp[i]['grades'][ioc]['kr'] sp[i]['bal']=round(rb/skr*0.9,2)+sp[i]['ad_bal'] #Сортування за рейтинговим балом, результат - список sort_sp sort_sp=sorted(sp.values(),key=lambda el:el['bal'],reverse=True) #Запис списку в файл file1=open('sort_dict1_rez.txt','w') for i in sort_sp: print(i['name'],'t',i['gr'],'t',i['bal']) file1.write(i['name']+'t'+i['gr']+'t'+str(i['bal'])+'n') file1.close()