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

kpstuanikira 10 views 25 slides Oct 21, 2025
Slide 1
Slide 1 of 25
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25

About This Presentation

NTU KhPI PTM Programming Fundamentals_Py_07_файли


Slide Content

Робота з файлами в Python Під час розв’язання задач на комп’ютері часто виникає необхідність у використанні даних, які записані на зовнішніх носіях інформації (дисках) і оформлені у вигляді файлів даних . Незалежно від того, які дані містять файли (числа, символи, рядки, списки, множини, словники тощо), в мові Python вони трактуються як потоки даних , які представляють собою послідовність байтів, що зчитуються або записуються. Файл – це іменований об'єкт, що зберігає однотипну інформацію (програма або будь-яка інша інформація) на якомусь носії ( флешка , вінчестер). Файли бувають двох видів: текстові та двійкові (бінарні). Текстові файли – це послідовність символів ( друковані символи і пробіли), згрупована в рядки, які відокремлені один від одного символами нового рядка ( ‘ \n ’ ) . Двійкові файли – це послідовність байтів, яка взаємно однозначно відповідає байтам на зовнішньому пристрої, причому ніякого перетворення символів не відбувається. В Python операції з файлами виконуються в наступному порядку:    відкрити файл;     читання або запис;    закрити файл.

Відкрити файл в 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 ') # читання та запис у двійковому режимі 2

Методи для роботи з файлами в Python 3

Запис у файл в 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 : mathematicsphysicschemistryinformaticsEnglish 4

Щоб записати в файл список у вигляді рядків потрібно використати ітератор . Наприклад: # 2 спосіб - запис списку рядків file1=open( 'file_subject_list 2.txt', 'w' ) for el in subject_list : file1.write( el+'\n' ) # або writelines file1.close() # 3 спосіб - запис списку рядків file1=open( 'file_subject_list 3.txt', 'w' ) for i in range ( len ( subject_list )): file1.writelines( subject_list [i] +'\n' ) file1.close() За допомогою функції print () також можна записувати дані в текстовий файл : # 4 спосіб - запис списку рядків функцією print file1=open( 'file_subject_list 4.txt', 'w' ) print ( subject_list ,file=file1) # записує як на екрані file1.close() В результаті створиться файл file_subject_list 2 .txt : mathematics physics chemistry informatics English В результаті створиться файл file_subject_list 3 .txt : mathematics physics chemistry informatics English В результаті створиться файл file_subject_list 4 .txt : ['mathematics', 'physics', 'chemistry', 'informatics', 'English'] 5

Читання файлів в 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) Результат: 6

Простіший спосіб зчитати текстовий файл – використати ітератор , що буде повертати по одному рядку за раз. Наприклад: #Зчитування 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) Найпростіший спосіб зчитати текстовий файл у вигляді списку рядків – використати функцію readline s () , яка повертає тип list . Наприклад: #Зчитування 4 спосіб (найкоротший) file1=open('file_subject_list2.txt','r') list4=file1.readlines() # тип list file1.close() print('list4=',list4,type(list4)) Результат: 7

Автоматичне закриття файлу ( використання синтаксису 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 . 8

Винятки в 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 дозволить перерахувати ці атрибути у вигляді рядків. 9

Н айбільш поширені вбудовані винятки в Python 10

11

Обробка винятків в 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 пропускається. 12

Перехоплення специфічних винятків в 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 . 13

Конструкція 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 . 14

Конструкція 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) Результат: 15

Обробка винятків у файлах Якщо під час виконання будь-якої операції з файлом виникає виняток, програма завершує виконання, не закриваючи при цьому файли. Одним із рішень в цій ситуації є використання блоку try...finally . Наприклад: try:     file1 = open("test.txt", "r")      read_content = file1.read()     print( read_content )  finally:     # Закриваємо файл      file1.close() Тут ми закрили файл у блоці finally , оскільки блок finally завжди виконується, то файл буде закритий, навіть якщо згенерується виняток. 16

Приклад 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) Результат: 17

Продовження прикладу 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() Результат (продовження): 18

Приклад 2 Надано текстовий файл file_tel_1.txt зі списком прізвищ і відповідних номерів телефонів:     Програма реалізує зчитування інформації з файлу, сортування списку абонентів за алфавітом, який записує в файл file_tel_sort.txt , і виводить номер телефону запитуваного абонента. 19

#Зчитування списку абонентів 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 ']) 20

Приклад 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 ) 21

# Сортування списку за середнім балом (останнім елементом) #Використана функція 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() 22

Приклад 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) 23

# виведення назв 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 () 24

# Обчислення рейтингового балу 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() 25
Tags