|
|
Програмування мовою Python: основи та практика Електронний посібник |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Під час створення програм часто
потрібно отримувати доступ до даних, що зберігаються на зовнішніх носіях у
формі файлів. Файли можуть бути джерелом інформації, з яких можна зчитувати
дані, або приймачем, де можна зберігати інформацію. Для взаємодії з файлами потрібно
створити логічне зв’язкування (файлову змінну) із фізичним файлом, що
розташований на диску.
Для отримання доступу до файлу
використовується функція open(),
яка повертає файловий об’єкт.
Отримана змінна file міститиме файловий об’єкт, що
пов’язаний з відповідним файлом на диску. Параметри функції open() вказують
ім’я файлу та режим відкриття. Для роботи з цим файлом буде необхідно
використовувати методи, доступні для змінної file.
У файлового об’єкта є низка
атрибутів, які можна отримати навіть після закриття файлу. file.closed – містить True,
якщо файл закритий і False, якщо файл відкритий. file.mode – містить
режим доступу до файлу. file.name – містить ім’я
файлу.
Також для файлового об’єкта передбачено два методи, за якими визначається можливість запису даних до файлу (file.readable()) чи можливість зчитування даних з файлу (file.writable()). Результатом
цих методів є значення логічного типу.
Для зчитування даних з файлу
передбачено кілька методів file.read(size). Зчитує
з файлу file.size символів.
Якщо параметр size не заданий чи його значення є
від’ємним, то зчитується весь файл. Якщо досягнуто кінець файлу, то за
методом file.read() буде
повернуто порожній рядок‘‘.
За методом file.readline() зчитується один рядок з файлу file. Символ закінчення рядка
―\n залишається
в
кінці рядка
і відсутній
лише в останньому рядку, якщо файл не
закінчується порожнім рядком. Це робить однозначним значення, отримане за
методом readline(); якщо отримано порожній рядок, то був досягнутий
кінець файлу, порожній же рядок подається символом ‘\ n’.
Порядкове читання з файлу можна виконати, використовуючи оператор for, тобто можна організувати перебір всіх елементів з файлу.
За потреби прочитати
всі рядки в список можна скористатися методами: list(file) або file.readlines()
Варто відмітити, що за методом file.write(string) відбувається запис відповідних рядкових даних у файл, і ніякого додавання вказівника кінця рядка не відбувається. Тобто всі
дані заносяться послідовно, без розбиття на рядки, якщо це явно не вказується.
Запис даних до файлу можна також організувати
з використанням методу print(). Як
зазначалося раніше, цей метод має необов’язковий параметр file, який стандартно дорівнює sys.stdout (стандартний
пристрій виведення ‒ екран). Якщо ж вказати значенням для цього
параметра файлову змінну, то за методом print()відбуватиметься
виведення даних не на екран, а в файл (запис даних до файлу).
На відміну від методу file.write(string), за методом print() крім запису власне рядкових даних, відбувається і дописування вказівника кінця рядка.
file.tell(). Повертає ціле число, яке відповідає
позиції файлового покажчика («умовного курсора») в файлі. Визначається в
байтах (символах). Наприклад, якщо прочитати перші п’ять
символів, то файловий покажчик буде встановлений на позиції 5.
file.seek(offset, from_what=0). Встановлює файловий покажчик в нову позицію, яка обраховується додаванням зміщення offset до точки відліку, заданої параметром from_what. Якщо from_what=0 – точкою відліку є початок файлу; якщо from_what=1 – точкою відліку є поточна позиція файлового покажчика; якщо from_what=2 ‒ точкою відліку є кінець файлу. Значення
параметра from_what, відмінне від 0,
використовується лише для бінарних файлів.
Є об’єкти, які потребують виконання певних дій після завершення роботи з ними, незалежно від успішності чи невдачі цих дій. Хоча для опрацювання виняткових ситуацій можна використовувати блоки управління помилками, у Python є менеджер контексту with as, який дає змогу автоматизувати ці завершальні дії. Подивимося на приклад використання менеджера контексту для роботи з файлами.
Робота з файлом, зазвичай, охоплює відкриття файлу, опрацювання даних та
закриття файлу. Під час обробки файлу можуть виникнути несподівані ситуації,
що призведуть до припинення виконання програми. Крім цього, необхідно завжди
пам’ятати про закриття файлу. Використання with as під час роботи з файлами у Python забезпечує автоматичне виконання
завершальних дій, зокрема закриття файлу, без необхідності явного вказування
цих дій.
Після завершення виконання зазначеного коду файл f завжди закривається, навіть якщо виникла проблема під час обробки файлу. Отже,
наведений код не потребує виклику оператора закриття файлу.
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))
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)] Завдання для самоперевірки
Ø В описах
функцій використовують ідентифікатор def,
за яким слідує ім’я функції, список аргументів (у круглих дужках), і
програмний код функції після двокрапки. Кожній функції відповідає об’єкт типу
function, ім’я функції є посиланням на цей об’єкт. Ø Функція може
повертати як результат іншу функцію, аргументи можуть мати початкові
значення, а також можуть бути описані глобальні та локальні змінні. У тілі
функції можуть також бути вкладені функції, які мають доступ до змінних
зовнішньої функції. Ø Для розуміння
та використання цих концепцій важливо вивчити та вдосконалити навички
відкриття та закриття файлу, атрибутів файлового об’єкта, читання з файлу,
запису в файл, а також використання менеджера контексту та додаткових методів
роботи з файлами. Ø Зокрема, в
описах функцій використовують ідентифікатор def,
за яким слідує ім’я функції, список аргументів (у круглих дужках) і
програмний код функції після двокрапки. Інструкція return у тілі функції завершує виконання програмного коду
функції, повертаючи значення, вказане після return,
як результат роботи функції. Ø Важливо
розуміти, що кожна функція є об’єктом типу function,
а її ім’я є посиланням на цей об’єкт. Посилання на функцію може бути
присвоєне змінній, даючи змогу використовувати цю змінну як ім’я функції. Ø Також слід
зазначити, що ім’я функції може передаватися як аргумент іншій функції або
повертатися як результат функції. У разі використання лямбда-функцій їх
описують за допомогою ключового слова lambda,
після якого вказують аргументи і вираз, який є результатом лямбда-функції. Ø Для розгляду
питання локальних та глобальних змінних важливо відзначити, що якщо змінній
присвоєно значення в тілі функції, то така змінна є локальною і доступна лише
у межах цієї функції. Для явного декларування змінної в тілі функції як
глобальної використовується ключове слово global. Ø Загалом,
освоєння цих концепцій стане важливою передумовою для успішної роботи з
файлами, їх відкриттям, закриттям, атрибутами та додатковими методами обробки
у мові програмування.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||