НМЦ

Програмування мовою Python: основи та практика

Електронний посібник

ВФПО

ТЕМА 9. ФАЙЛИ

 

 

 

 

Уроки Python з нуля / #13 – Робота з файлами за рахунок Пітон

 

Презентація. Файли в PYTHON №13

 

 

Під час створення програм часто потрібно отримувати доступ до даних, що зберігаються на зовнішніх носіях у формі файлів. Файли можуть бути джерелом інформації, з яких можна зчитувати дані, або приймачем, де можна зберігати інформацію.

Для взаємодії з файлами потрібно створити логічне зв’язкування (файлову змінну) із фізичним файлом, що розташований на диску.

 

З погляду програміста, файли є двох типів:

1) текстові, які містять текст, розділений на рядки;

2) бінарні, в яких можуть зберігатися будь-які дані та будь-які коди без обмежень; в бінарних файлах зберігаються малюнки, звуки, відео та інше.

 

 

Для отримання доступу до файлу використовується функція open(), яка повертає файловий об’єкт.

 

Виклик цієї функції має вигляд:

file = open()

 

Отримана змінна file міститиме файловий об’єкт, що пов’язаний з відповідним файлом на диску. Параметри функції open() вказують ім’я файлу та режим відкриття. Для роботи з цим файлом буде необхідно використовувати методи, доступні для змінної file.

 

Повний формат цієї функції має вигляд:

open(fname, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

fnameце шлях або ідентифікатор файлу, який може бути числовим дескриптором або абсолютним/відносним шляхом до файлу, який ми плануємо відкрити.

mode ‒ це рядок, що вказує режим відкриття файлу.

Режими включають:

‘r’: відкрити файл для читання (як усталено).

‘w’: відкрити файл для запису. Якщо файлу немає, створиться новий файл; якщо є, вміст файлу буде перезаписаний.

‘x’: відкрити файл для запису. Якщо файлу немає, створиться новий файл; якщо файл є, виникне виняток FileExistsError.

‘a’: відкрити файл для запису, який відбувається, в кінець файлу.

‘+’: відкрити файл для читання та запису, що відбувається, в кінець файлу (має сенс лише з ‘r’, наприклад, ‘r+’, але може комбінуватися з іншими режимами).

 

Нагадаємо, що у разі використання режиму ‘w’ на диску створюється файл. Якщо файл з вказаним ім’ям вже є під час його відкриття, то вміст існуючого файлу буде видалено.

 

Параметри ‘b’ або ‘t’ розрізняють двійковий та текстовий режим введення/виведення.

buffering ‒ визначає політику буферизації під час роботи із файлом.

encoding ‒ кодування файлу (використовується лише в текстовому режимі).

errors ‒ метод обробки помилок під час кодування та декодуванні файлу (використовується лише в текстовому режимі).

newline ‒ опрацювання вказівника кінця рядка (використовується лише для текстових файлів).

closefd ‒ закриття файлового дескриптора (використовується лише для файлів, вказаних своїм дескриптором).

opener ‒ користувацький метод відкриття файлу.

 

Якщо під час відкриття файлу для запису вказати ім’я вже існуючого файлу з інформацією, то її буде втрачено. Якщо файлу немає – створиться новий.

Якщо файл, який відкривається  для читання, не знайдено, виникає помилка.

 

 

У файлового об’єкта є низка атрибутів, які можна отримати навіть після закриття файлу.

file.closed – містить True, якщо файл закритий і False, якщо файл відкритий.

file.mode – містить режим доступу до файлу.

file.name містить ім’я файлу.

>>> f=open(«test.txt», «r»)

>>> print(«file.closed: « + str(f.closed)) file.closed: False

>>> print(«file.mode: « + f.mode) file.mode: r

>>> print(«file.name: « + f.name) file.name: test.txt

>>> f.close()

>>> print(«file.closed: « + str (f.closed)) file.closed: True

Також для файлового обєкта передбачено два методи, за якими визначається можливість запису даних до файлу (file.readable()) чи можливість зчитування даних з файлу (file.writable()). Результатом цих методів є значення логічного типу.

 

 

Для зручності вважатимемо, що на диску вже є текстовий файл test.txt, який має структуру:

1 2 3 4 5

Work with file

 

Для зчитування даних з файлу передбачено кілька методів file.read(size). Зчитує з файлу file.size символів. Якщо параметр size не заданий чи його значення є від’ємним, то зчитується весь файл. Якщо досягнуто кінець файлу, то за методом file.read() буде повернуто порожній рядок‘‘.

>>> f=open(«test.txt», «r»)

>>> f.read()

‘1 2 3 4 5\nWork with file\n’

>>> f.close()

>>> f=open(«test.txt», «r»)

>>> f.read(5)

‘1 2 3’

>>> f.close()

За методом file.readline() зчитується один рядок з файлу file. Символ закінчення рядка \n залишається в кінці рядка і відсутній лише в останньому рядку, якщо файл не закінчується порожнім рядком. Це робить однозначним значення, отримане за методом readline(); якщо отримано порожній рядок, то був досягнутий кінець файлу, порожній же рядок подається символом ‘\ n’.

>>> f=open(«test.txt», «r»)

>>> f.readline()

‘1 2 3 4 5\n’

>>> f.close()

Порядкове читання з файлу можна виконати, використовуючи оператор for, тобто можна організувати перебір всіх елементів з файлу.

>>> f=open(«test.txt», «r»)

>>> for line in f: print(line, end=‘‘)

1 2 3 4 5

Work with file

>>> f.close()

За потреби прочитати всі рядки в список можна скористатися методами: list(file) або file.readlines()

>>> f=open(«test.txt», «r»)

>>> a=list(f)

>>> a

[‘1 2 3 4 5\n’, ‘Work with file’]

>>> f.close()

>>> f=open(«test.txt», «r»)

>>> b=f.readlines()

>>> b

[‘1 2 3 4 5\n’, ‘Work with file’]

>>> f.close()

 

 

Для запису даних у файл використовується метод file.write(string).

За вдалого запису рядка до файлу за методом повертається кількість записаних символів.

>>> f=open(«test.txt», «a»)

>>> f.write(«Test string»)

11

>>> f.close()

Щоб записати щось відмінне від рядка, воно має бути приведене до рядка:

>>> f=open(«test.txt», «a»)

>>> f.write(str(2019))

4

>>> f.close()

 

Варто відмітити, що за методом file.write(string) відбувається запис відповідних рядкових даних у файл, і ніякого додавання вказівника кінця рядка не відбувається. Тобто всі дані заносяться послідовно, без розбиття на рядки, якщо це явно не вказується.

 

Якщо подивитися на вміст файлу «test.txt», то можна побачити:

1 2 3 4 5

Work with file2019

 

Запис даних до файлу можна також організувати з використанням методу print(). Як зазначалося раніше, цей метод має необов’язковий параметр file, який стандартно дорівнює sys.stdout (стандартний пристрій виведення екран).

Якщо ж вказати значенням для цього параметра файлову змінну, то за методом print()відбуватиметься виведення даних не на екран, а в файл (запис даних до файлу).

>>> f=open(«test.txt», «a»)

>>> print(«Test string1»,   file=f)

>>> print(«Test string2»,   file=f)

>>> f.close()

На відміну від методу file.write(string), за методом print() крім запису власне рядкових даних, відбувається і дописування вказівника кінця рядка.

 

Якщо поглянути на вміст файлу «test.txt», то можна побачити:

1 2 3 4 5

Work with file2019Test string1

Test string2

 

 

file.tell(). Повертає ціле число, яке відповідає позиції файлового покажчика («умовного курсора») в файлі. Визначається в байтах (символах).

Наприклад, якщо прочитати перші п’ять символів, то файловий покажчик буде встановлений на позиції 5.

>>> f=open(«test.txt», «r»)

>>> f.read(5)

‘1 2 3’

>>> f.tell()

5

>>> f.close()

file.seek(offset, from_what=0). Встановлює файловий покажчик в нову позицію, яка обраховується додаванням зміщення offset до точки відліку, заданої параметром from_what. Якщо from_what=0 точкою відліку є початок файлу; якщо from_what=1 точкою відліку є поточна позиція файлового покажчика; якщо from_what=2 точкою відліку є кінець файлу. Значення параметра from_what, відмінне від 0, використовується лише для бінарних файлів.

>>> f=open(«test.txt», «rb»)

>>> f.seek(4)

>>> f.read(1)

b’3’

>>> f.seek(1, 1)

>>> f.read(1)

b’4’

>>> f.close()

 

9.6. Використання менеджера контексту

 

Є обєкти, які потребують виконання певних дій після завершення роботи з ними, незалежно від успішності чи невдачі цих дій. Хоча для опрацювання виняткових ситуацій можна використовувати блоки управління помилками, у Python є менеджер контексту with as, який дає змогу автоматизувати ці завершальні дії.

Подивимося на приклад використання менеджера контексту для роботи з файлами. Робота з файлом, зазвичай, охоплює відкриття файлу, опрацювання даних та закриття файлу. Під час обробки файлу можуть виникнути несподівані ситуації, що призведуть до припинення виконання програми. Крім цього, необхідно завжди пам’ятати про закриття файлу.

Використання with as під час роботи з файлами у Python забезпечує автоматичне виконання завершальних дій, зокрема закриття файлу, без необхідності явного вказування цих дій.

with open(«test.txt») as f:

    for line in f:

        print(line, end=««)

Після завершення виконання зазначеного коду файл f завжди закривається, навіть якщо виникла проблема під час обробки файлу. Отже, наведений код не потребує виклику оператора закриття файлу.

 

Якщо остання рядок у файлі не закінчується символом \n, то метод readline() поверне послідовність символів без \n.

 

 

Приклад. Написати програму створення текстового файлу з рядків, заданих користувачем.

fn=input(«Введіть ім’я файлу: «)

f=open(fn,’w’)

print(‘Введіть рядки для запису в файл.’)

print(‘Для завершення введіть «end.» без лапок.’)

s=input()

while s!=‘end.’:

    f.write(s+’\n’)

    s=input()

f.close()

 

Приклад. Дано текстовий файл, який містить дані, записані окремими рядками. Вивести на екран всі рядки файлу, згрупувавши спочатку рядки парної довжини, а потім рядки непарної довжини.

fn=input(«Введіть ім’я файлу: «)

with open(fn,’r’) as f:

     print(‘Рядки парної довжини:’)

     for i in f:

       if (len(i)-1)%2==0: print(i,end=‘‘)

    print(‘Рядки не парної довжини:’)

    f.seek(0)

    for i in f:

       if (len(i)-1)%2==1: print(i,end=‘‘)

 

Приклад. Дано текстовий файл, кожен рядок якого містить координату точок в декартовій системі координат. Координата кожної точки записана двома дійсними числами через пропуск. Вивести на екран координату точки, максимально віддаленої від початку координат, і відстань до неї.

dist=0

dist_x=0

dist_y=0

import math as m

fn=input(«Введіть імя файлу: «)

with open(fn, ‘r’) as f:

    for i in f:

      x, y=i.split()

      x, y=float(x), float(y)

      tmp=m.sqrt(x**2+y**2)

      if tmp>dist:

         dist=tmp

         dist_x=x

         dist_y=y

print(‘На максимальній відстані ({:.3}) від початку координат 

      розташована точка з координатами ({},

      {})’.format(dist,dist_x,dist_y))

 

Приклад. Дано цілочисельну матрицю випадкових цілих чисел розміром n´n (n задає користувач). Написати програму для запису цієї матриці до файлу в «природній» формі (кожен окремий рядок файлу має містити елементи відповідного рядка матриці, записані через пропуск).

import random as rnd

n=int(input(‘Вкажіть розмірність матриці:’))

m=[]

for i in range(n):

   a=[]

   for j in range(n):

      x=rnd.randint(1,9)

      a.append(x)

   m.append(a)

fn=input(«Введіть імя файлу: «)

with open(fn,’w’) as f:

    for i in m:

      for j in i:

        print(str(j), sep=‘‘, end=‘ ‘,file=f)

        print(‘‘,file=f)

 

Приклад. Дано текстовий файл, який містить дані про матрицю, записану в «природній» формі (кожен окремий рядок файлу має містити елементи відповідного рядка матриці, записані через пропуск). Вичитати матрицю з файлу та знайти мінімальний елемент матриці.

fn=input(«Введіть ім’я файлу: «)

m=[]

with open(fn,’r’) as f:

     a=list(f)

     for i in a:

        b=list(map(int, i.split()))

        m.append(b)

min_col=list(map(min, m))

min_el=min(min_col)

print(min_el)

Вичитати матрицю з файлу можна і такими операторами.

m=[]

with open(‘4.txt’,’r’) as f:

    m=[list(map(int, i.split())) for i in list(f)]

 

Завдання для самоперевірки

Завдання 1. Для завдання розробити алгоритм та написати відповідну програму з виведенням результатів на екран.

Вимоги до програми:

v вхідні дані ввести за допомогою стандартних процедур введення;

v на друк вивести значення вхідної інформації та результати обчислень;

v  вхідні дані взяти довільними, в межах допустимих, якщо вони явно не задані в умові задачі.

Варіанти:

1. Компонентами файлу g є натуральні числа від 96 до 158. Знайти:

а) кількість парних чисел з-поміж його компонент;

б) кількість непарних чисел з-поміж його компонент;

2. Дано файл f, компонентами якого є натуральні числа. Записати у файл g всі компоненти файлу f, які є парними числами.

3. Дано файл f, компонентами якого є натуральні числа. Записати у файл g всі компоненти файлу f, які діляться на 3 і не діляться на 7.

 

Завдання 2. Для завдання розробити алгоритм та написати відповідну програму з виведенням результатів на екран.

Вимоги до програми:

v вхідні дані ввести за допомогою стандартних процедур введення;

v на друк вивести значення вхідної інформації та результати обчислень;

v вхідні дані взяти довільними, в межах допустимих, якщо вони явно не задані в умові задачі.

Варіанти

1. Сформувати файл «BOOK», який містить інформацію про книги вашої бібліотеки. Інформація має містити прізвище автора, назву книги, видавництво та рік видання. Використовуючи сформований файл, роздрукувати інформацію про книги, видані у видавництві «Просвіта».

2. Сформувати файл, якій містить інформацію про побутові холодильники: назва холодильника, вартість, об’єм холодильної камери, завод-виготовлювач. Використовуючи сформований файл, роздрукувати інформацію про холодильники, вартість яких становить понад 55000 гривень.

3. Під час футбольної гри формується файл, який містить прізвище гравця та кількість набраних за гру балів. Використовуючи сформований файл, роздрукувати прізвища трьох найрезультативніших гравців команди.

4. Сформувати файл, який містить інформацію про потяги, які слідують до Києва (номер потяга, повна назва, час в дорозі). Використовуючи сформований файл, роздрукувати інформацію про потяги, час перебування в дорозі яких не перевищує 6 годин.

 

 

Ø В описах функцій використовують ідентифікатор def, за яким слідує ім’я функції, список аргументів (у круглих дужках), і програмний код функції після двокрапки. Кожній функції відповідає об’єкт типу function, ім’я функції є посиланням на цей об’єкт.

Ø Функція може повертати як результат іншу функцію, аргументи можуть мати початкові значення, а також можуть бути описані глобальні та локальні змінні. У тілі функції можуть також бути вкладені функції, які мають доступ до змінних зовнішньої функції.

Ø Для розуміння та використання цих концепцій важливо вивчити та вдосконалити навички відкриття та закриття файлу, атрибутів файлового об’єкта, читання з файлу, запису в файл, а також використання менеджера контексту та додаткових методів роботи з файлами.

Ø Зокрема, в описах функцій використовують ідентифікатор def, за яким слідує ім’я функції, список аргументів (у круглих дужках) і програмний код функції після двокрапки. Інструкція return у тілі функції завершує виконання програмного коду функції, повертаючи значення, вказане після return, як результат роботи функції.

Ø Важливо розуміти, що кожна функція є об’єктом типу function, а її ім’я є посиланням на цей об’єкт. Посилання на функцію може бути присвоєне змінній, даючи змогу використовувати цю змінну як ім’я функції.

Ø Також слід зазначити, що ім’я функції може передаватися як аргумент іншій функції або повертатися як результат функції. У разі використання лямбда-функцій їх описують за допомогою ключового слова lambda, після якого вказують аргументи і вираз, який є результатом лямбда-функції.

Ø Для розгляду питання локальних та глобальних змінних важливо відзначити, що якщо змінній присвоєно значення в тілі функції, то така змінна є локальною і доступна лише у межах цієї функції. Для явного декларування змінної в тілі функції як глобальної використовується ключове слово global.

Ø Загалом, освоєння цих концепцій стане важливою передумовою для успішної роботи з файлами, їх відкриттям, закриттям, атрибутами та додатковими методами обробки у мові програмування.

 

Питання для перевірки засвоєних знань

1. Як відкрити файл у програмі?

2. Які типи доступу до файлів  під час їх відкриття?

3. Які параметри потрібні для відкриття файлу?

4. Як перевірити успішність відкриття файлу?

5. Які можливості надає режим читання/запису файлу?

6. Як закрити файл після роботи з ним?

7. Які наслідки неявного закриття файлу?

8. Які методи для закриття файлів є у програмуванні?

9. Чи впливає відкриття/закриття файлу на продуктивність програми?

10. Як перевірити успішне закриття файлу?

11. Які основні атрибути файлів у операційних системах?

12. Як отримати доступ до атрибутів файлу?

13. Які атрибути можуть змінюватися і як це впливає на функціональність файлу?

14. Які атрибути файлу є найважливішими для користувача?

15. Як відрізнити час створення, модифікації та доступу до файлу?

16. Як змінити атрибути файлу?

17. Які атрибути дають змогу встановлювати додаткову інформацію про файл?

18. Чому важливо зберігати атрибути файлів під час їх обробки та пересилання?

Попередня тема

На початок