Файли. Загальні поняття. Відкриття/закриття файлу. Функції open(), close()
Зміст
- 1. Загальні поняття про файл
- 2. Особливості роботи з файлами в Python
- 3. Типи файлів у Python. Текстові файли. Бінарні файли
- 4. Відкриття файлу. Функція open(). Загальна форма
- 5. Параметр mode. Режими відкриття файлів
- 6. Закриття файлу. Функція close()
- 7. Функції open(), close(). Відкриття/закриття файлу для різних типів файлів
- 8. Особливості відкриття файлу для оновлення у двійковому форматі. Режими ‘w+b’, ‘r+b’
- 9. Приклад, що демонструє різні випадки політики буферизації (значення buffering)
- 10. Як вивести розмір буферу, який встановлений за замовчуванням? Приклад
- Зв’язані теми
Пошук на інших ресурсах:
1. Загальні поняття про файл
У програмах на Python існує можливість роботи з файлами, які є базовими вбудованими типами об’єктів. Файл – це іменована область постійної пам’яті. Керуванням роботою файлу займається операційна система. Для кожного файлу створюється об’єкт, який забезпечує зв’язок з файлом. Файл може бути розміщений в будь-якому місці комп’ютера (жорсткий диск, флеш-носій тощо).
Будь-який файл має ім’я, яке може бути повним або скороченим. У випадку повного імені (повний шлях до файлу) в ім’я файлу включається:
- носій (ресурс) на якому розміщений файл (диск C:, D:);
- перелік каталогів (папок) з верхнього до нижнього рівня розділених символом ‘\’ (зворотній дріб). Приклад повного імені: “C:\ABC\myfile.txt”.
Якщо використовується скорочене ім’я, то включається відносний шлях, а саме:
- перелік каталогів (папок) відносно поточного каталогу, в якому розміщується вихідний файл модуля Python з розширенням *.py. Приклад скороченого імені “TEXT\myfile.txt”.
Файл може містити будь-яку інформацію, яка різними програмами інтерпретується по своєму в залежності від формату. Формат файлу – це спосіб кодування інформації з метою її подальшого ефективного використання та зберігання. Різні програми використовують різні формати файлів. Багато широко розповсюджених форматів файлів є стандартизовані та опубліковані.
⇑
2. Особливості роботи з файлами в Python
При роботі з файлами в мові Python можна виділити наступні особливості:
- файли в Python не належать ні до чисел, ні до послідовностей, ні до відображень;
- дані, що отримуються з файлу, відображаються у вигляді рядка. Тому, для представлення даних в інших типах об’єктів, потрібно реалізовувати їх конвертування. Це стосується як читання з файлу, так і запису даних у файл. Якщо здійснюється запис у файл, то методам обробки потрібно передавати вже сформовані рядки;
- необов’язково викликати метод close(). Цей метод буде викликаний автоматично після закінчення програми. Однак, виклик методу close() для закриття файлу є рекомендованим (дивіться п. 6);
- файли забезпечують буферизацію введення/виведення. За замовчуванням, вивід в файли здійснюється з допомогою проміжних буферів (спеціально відведених ділянок пам’яті заданого розміру). Якщо виконується операція запису, то дані спершу попадають в буфер, а потім пізніше можуть бути записані у файл (функції flush(), close()). За бажанням можна відключити режим буферизації. Більш детально про буферизацію описується в п. 4;
- файли дозволяють виконувати позиціонування при якому змінюється позиція читання/запису у файлі.
⇑
3. Типи файлів у Python. Текстові файли. Бінарні файли
У мові програмування Python виділяють два типи файлів:
- текстовий тип. Це файли, які представлені у вигляді рядків типу str. У мові Python для таких рядків відбувається автоматичне кодування/декодування символів Unicode а також відповідним чином обробляється символ кінця рядка;
- бінарний (двійковий) тип. Це файли, що представлені у вигляді рядків типу bytes. Такі рядки при запису в файл передаються без додаткової обробки. Так само при читанні з файлу, рядки не обробляються.
⇑
4. Відкриття файлу. Функція open(). Загальна форма
Для того, щоб отримати доступ до файлу попередньо цей файл потрібно відкрити. Після відкриття файлу можна реалізовувати читання з файлу або запис деякої інформації у файл.
Відкриття файлу здійснюється з допомогою функції open(). Ця функція повертає відповідний файловий об’єкт. Якщо файл не може бути відкритий, то викликається виключення OSError. Це виключення генерується, коли відбуваються помилки в операціях вводу/виводу такі як “файл не знайдено” або інші.
Згідно з документацією Python функція open() має наступну загальну форму
open(file, mode = 'r', buffering = -1, encoding = None, errors = None, closefd = True, opener = None)
тут
- file – це рядок або цілочисельне значення. Якщо вказується рядок, то file визначає шлях до файлу (повне або скорочене ім’я файлу). Наприклад: ‘C:\1.txt’, ‘file.txt’. Якщо вказується цілочиселне значення, то це означає, що file є файловий дескриптор. Параметр file є обов’язковим у функції open(). Усі інші параметри є необов’язкові;
- mode – необов’язковий рядок, що задає режим відкриття файлу. За замовчуванням mode = ‘r’, це означає що файл відкривається у текстовому режимі для читання. Значення mode формується згідно з значеннями, що описуються у пункті 4. Для текстового режиму необов’язково задавати значення ‘t’. Якщо файл відкривається у бінарному (двійковому) режимі, то до значення mode обов’язково додається ‘b’;
- buffering – необов’язкове ціле число, яке використовується для встановлення політики буферизації. Поняття “буферизація” означає, що при читанні (запису) інформації з файлу (у файл) ця інформація попередньо записується у спеціальну ділянку оперативної пам’яті – буфер (buffer). Таким чином, інформація дублюється у буфері заданого розміру. Правильно підібране значення розміру буферу дозволяє прискорити виконання програми, яка інтенсивно використовує роботу з файлами. Значення buffering може бути одним з чотирьох можливих:
- buffering = 0. У цьому випадку буферизація відключена. Значення 0 дозволяється встановлювати тільки для двійкових файлів (режим з позначенням ‘b’).
- buffering = 1 – рядкова буферизація, яка є доступна тільки для текстових файлів. Буфером служить рядок змінного розміру.
- buffering>1 – буферизація включена як для текстових так і для двійкових файлів. Тут значення buffering задає фіксований розмір буферу в байтах.
- buffering не задано – це є випадок за замовчуванням коли buffering = -1. Якщо не вказати значення buffering, то політика буферизації працює наступним чином:
- 1. Для двійкових файлів формується фіксований розмір буфера, значення якого отримується з величини io.DEFAULT_BUFFER_SIZE.
- 2. Для так званих “інтерактивних” текстових файлів використовується буферизація рядка (buffering = 1). Для інших текстових файлів використовується така сама буферизація як для двійкових файлів описану вище;
- encoding – ім’я кодування, яке використовується для кодування чи декодування файлу. Цей параметр використовується тільки для текстових файлів. Якщо encoding не задано, то використовується кодування за замовчуванням яка залежить від платформи;
- errors – необов’язковий рядковий параметр, який визначає як повинні оброблятись помилки кодування та декодування. Цей параметр використовується тільки для текстових файлів. Параметр errors може приймати одне зі значень: ‘strict’, ‘ignore’, ‘replace’, ‘surrogateescape’, ‘xmlcharrefreplace’, ‘backslashreplace’, ‘namereplace’. Більш детально про обробку помилок кодування можна знайти в документації Python;
- newline – необов’язковий параметр, який контролює роботу універсального режиму нового рядка. Цей параметр використовується тільки в текстовому режимі. Параметр newline може приймати одне з наступних значень: None, ‘\n’, ‘\r’ або ‘\r\n’. Більш детально про використання символів нового рядка в різних режимах можна знайти в документації Python;
- closefd – необов’язковий параметр, який має сенс у випадку коли замість імені файлу заданий дескриптор. Якщо задано ім’я файлу, то значення closefd обов’язково повинно бути рівним True (значення за замовчуванням), інакше виникне помилка. У випадку, коли заданий дескриптор файлу розглядаються 2 моживі ситуації:
- closefd = False. У цьому випадку базовий дескриптор буде залишатись відкритим після закриття файлу.
- closefd = True. Після закриття файлу базовий дескриптор файлу закривається.
- opener – цей необов’язковий параметр задає функцію користувача, яка може бути використана для відкриття файлу. У цьому випадку користувач повинен задати власну функцію відкриття файлу. За замовчуванням значення opener = None.
⇑
5. Параметр mode. Режими відкриття файлів
Нижче перераховано усі можливі символи, що визначають різні режими відкриття файлів які можуть бути вказані у параметрі mode функції open(). Символи можуть утворювати послідовності, наприклад ‘rb’, ‘rt’, ‘wb’, ‘wt’, ‘r+b’, ‘w+b’.
Режими відкриття файлу в залежності від значення mode:
- ‘r’ – файл відкривається для читання (режим за замовчуванням);
- ‘w’ – файл відкривається для запису. Якщо файл з таким іменем вже існує, то попередній вміст файлу знищується;
- ‘x’ – файл відкривається для ексклюзивного створення. Якщо такий файл вже існує, то виникає збій;
- ‘a’ – відкриває файл для запису. Якщо такий файл вже існує, то відкриває файл для додавання (інформація записується з кінця файлу);
- ‘b’ – двійковий тип файлу. Це значення може бути в поєднанні зі значеннями ‘r’, ‘w’, ‘x’, ‘a’;
- ‘t’ – текстовий тип файлу. Це значення може бути в поєднанні з ‘r’, ‘w’, ‘x’, ‘a’. Текстовий тип файлу встановлюється за замовчуванням;
- ‘+’ – відкрити файл на диску для оновлення (читання/запису);
- ‘U’ – режим, що визначає представлення символу нового рядка: в конвенції Unix це ‘\n’, в Windows – ‘\r\n’, в Macintosh – ‘\r’.
⇑
6. Закриття файлу. Функція close()
Після того, як файл відкрито та оброблено (прочитано, записано нову інформацію) його потрібно закрити. Закриття файлу здійснюється з допомогою методу close(). Виклик методу close() розриває зв’язок об’єкту з зовнішнім файлом.
У мові Python необов’язково викликати метод close() для закриття файлу. Однак, рекомендується викликати close() у випадку, якщо після використання файлу виконання програми продовжується (що характерно для великих програм).
При виклику методу close() звільнюються ресурси, які були виділені системою для файлового об’єкту. Якщо файл було відкрито з підтримкою буферизації, то дані з цих буферів виштовхуються і буфера звільняються. У великих програмних системах рекомендується здійснювати виклик close(), тому що після цього система має більше вільних ресурсів для своєї роботи.
Можна порекомендувати наступний алгоритм використання файлів:
- відкрити файл;
- здійснити операції з файлом (читання/запис);
- якщо файл більше не потрібен, то закрити цей файл функцією close().
Приклад.
Якщо файл було відкрито наступним чином:
f = open('myfile.txt', 'r')
то після закінчення використання цього файлу його потрібно закрити функцією close()
f.close()
яка розриває зв’язок з зовнішнім файлом.
У мові Python функція close() є необов’язковою (на відміну від інших мов програмування).
Якщо після виклику функції close() спробувати викликати методи роботи з файлом (читання або запис), то буде згенеровано помилку ValueError.
⇑
7. Функції open(), close(). Відкриття/закриття файлу для різних типів файлів
Нижче наведено приклади, що містять обробку текстових та бінарних файлів з допомогою наступних операцій:
- відкриття файлу функцією open();
- обробку файлів – читання/запис файлів;
- закриття файлу функцією close().
⇑
7.1. Відкриття у текстовому форматі
7.1.1. Читання з файлу, режими ‘r’, ‘rt’. Приклад
# Відкрити файл для читання у текстовому режимі # Спосіб 1. Відкрити файл 'myfile1.txt' - скорочений шлях до файлу f1 = open('myfile1.txt','r') # Спосіб 2. Відкрити файл, що розміщений за шляхом c:\2\myfile2.txt # 'rt' - читання файлу в текстовому режимі f2 = open('c:\\2\\myfile2.txt', 'rt') # Після відкриття можна працювати з вмістимим файлу # ... # Наприклад, прочитати деякий рядок з файлу myfile1.txt s1 = f1.readline() print(s1) s2 = f2.readline() # Прочитати рядок з файлу myfile2.txt print(s2) # Закрити файли (у мові Python необов'язково) f1.close() f2.close()
⇑
7.1.2. Запис у файл, режими ‘w’, ‘wt’
Щоб відкрити файл для запису в текстовому форматі потрібно використати позначення режимів ‘w’ або ‘wt’.
# Відкрити файл для запису у текстовому режимі, # можна також задавати 'wt' f3 = open('myfile3.txt', 'wt') # Запис у файл # ... # Записати у файл декілька рядків f3.write("using static System.Console;\n") f3.write("class Program\n") f3.write("{ }\n") # Закрити файл f3.close()
⇑
7.2. Відкриття у бінарному (двійковому) режимі
7.2.1. Режими ‘wb’, ‘w+b’ – запис інформації у файли
# Двійковий режим # Запис списку у файл # Заданий список A = [1, True, 2.88] # Відкрити файл для запису f1 = open('myfile1.bin', 'wb') f2 = open('myfile2.bin', 'w+b') # Для зручної роботи у двійковому форматі # доцільно використати можливості модуля pickle import pickle # метод dump() - записує об'єкт у файл pickle.dump(A,f1) pickle.dump(A,f2) # Закрити файли, з якими зв'язані об'єкти f1, f2 f1.close() f2.close()
⇑
7.2.2. Режими ‘rb’, ‘r+b’ – читання інформації з файлів
# Двійковий режим # Читання списку з файлу # Для зручної роботи у двійковому форматі # доцільно використати можливості модуля pickle import pickle # Зчитати список f1 = open('myfile1.bin', 'rb') f2 = open('myfile2.bin', 'r+b') # метод load() - завантажує дані з файлу B1 = pickle.load(f1) B2 = pickle.load(f2) print("B1 = ", B1) print("B2 = ", B2) f1.close() f2.close()
Результат виконання програми
B1 = [1, True, 2.88] B2 = [1, True, 2.88]
⇑
8. Особливості відкриття файлу для оновлення у двійковому форматі. Режими ‘w+b’, ‘r+b’
Якщо у функції open() параметр mode містить символ ‘+’, то файл відкривається для оновлення. Тут можливі два варіанти параметру mode:
- mode = ‘w+b’. У цьому випадку файл обрізається до 0 байт;
- mode = ‘r+b’. У цьому випадку файл відкривається без обрізання зі збереженням попередньої інформації. Покажчик читання/запису встановлюється в кінець файлу.
⇑
9. Приклад, що демонструє різні випадки політики буферизації (значення buffering)
# Читання файлу. Демонстрація буферизації. # Різні значення параметру buffering # -------------------------------------- # 1. buffering = 0 # 1.1. Для текстових файлів - помилка, виключення з повідомленням # "can't have unbuffered text I/O" # f1 = open("myfile1.txt", buffering = 0) - тільки у двійковому режимі # 1.2. Для бінарних файлів f1 = open("myfile1.bin", mode='rb', buffering=0) buffer = f1.read() # зчитати інформацію print("Read from myfile1.bin. buffer = ", buffer) # вивести її f1.close() # ------------------------------------- # 2. buffering = 1 # 2.1. Для текстових файлів f1 = open("myfile1.txt", buffering=1) s = f1.readline() # Зчитати рядок print("Read from myfile1.txt. s = ", s) f1.close() # 2.2. Для бінарних файлів f1 = open("myfile1.bin", mode='rb', buffering=1) buffer = f1.read() print("Read from myfile1.bin. buffer = ", buffer) f1.close() # -------------------------------------- # 3. buffering = 128 - розмір буферу 128 байт f1 = open("myfile1.txt", buffering = 128) f2 = open("myfile1.bin", 'rb', buffering = 128) s = f1.readline() # прочитати рядок print("Read from myfile1.txt. s = ", s) buffer = f2.readline() print("Read from myfile1.bin. buffer = ", buffer) f1.close() f2.close()
Результат виконання програми
Read from myfile1.bin. buffer = b'\x80\x03]q\x00(K\x01\x88G@\x07\n=p\xa3\xd7\ne.' Read from myfile1.txt. s = #include <iostream.h> Read from myfile1.bin. buffer = b'\x80\x03]q\x00(K\x01\x88G@\x07\n=p\xa3\xd7\ne.' Read from myfile1.txt. s = #include <iostream.h> Read from myfile1.bin. buffer = b'\x80\x03]q\x00(K\x01\x88G@\x07\n'
⇑
10. Як вивести розмір буферу, який встановлений за замовчуванням? Приклад
Розмір буферу в байтах за замовчуванням встановлений в значенні io.DEFAULT_BUFFER_SIZE.
import io print(io.DEFAULT_BUFFER_SIZE)
Результат роботи програми
Buffer size = 8192
⇑
Зв’язані теми
⇑