Python. Файли. Загальні поняття. Відкриття/закриття файлу. Функції open(), close()




Файли. Загальні поняття. Відкриття/закриття файлу. Функції open(), close()


Зміст


Пошук на інших ресурсах:

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

 


Зв’язані теми