Python. Модуль io. Ієрархія класів. Клас io.IOBase. Методи роботи з файлами класу IOBase




Модуль io. Ієрархія класів. Клас io.IOBase. Методи роботи з файлами класу IOBase

Перед вивченням даної теми рекомендується ознайомитись з наступною темою:


Зміст


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

1. Модуль io. Призначення. Типи вводу/виводу

Модуль io забезпечує засоби для роботи з різними типами вводу/виводу. У мові Python забезпечуються 3 основні типи вводу/виводу:

  • текстовий ввід/вивід – забезпечує роботу з рядковими об’єктами типу str;
  • двійковий або бінарний ввід/вивід – забезпечує роботу з двійковими об’єктами типу bytes;
  • буквальний ввід/вивід (raw input/output) або небуферизований ввід/вивід.

Для кожного з типів вводу/виводу створюється файловий об’єкт, який ще називають потоковий об’єкт.

 

2. Ієрархія класів потоків вводу/виводу

На рисунку 1 зображено ієрархію класів вводу/виводу. У вершині ієрархії розміщується абстрактний клас IOBase.

Python. Ієрархія класів вводу/виводу

Рисунок 1. Ієрархія класів вводу/виводу

 

3. Клас io.IOBase

Абстрактний клас IOBase описується в модулі io. Цей клас є базовим класом в ієрархії класів вводу/виводу (дивіться рисунок 1). У класі оголошено базові методи та властивості, частина яких перевизначається в успадкованих класах BufferedIOBase, TextIOBase, RawIOBase.

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

Клас io.IOBase підтримує протокол ітератора. Це означає, що об’єкт IOBase може бути повторений з отриманням рядків у потоці (метод readline()). Представлення отриманих рядків відрізняється для текстових та двійкових файлів.

 



4. Методи класу io.IOBase
4.1. Метод close(). Закриття файлу

Метод close() реалізує закриття файлу. Після виклику close() потік, зв’язаний з файлом, очищується і закривається. Цей метод немає ефекту, якщо файл вже закрито. Тобто другий, третій і т.д. виклик close() над закритим файлом не матиме ефекту.

Якщо файл закрито, то будь-яка операція читання з файлу або запису у файл викличе виключення ValueError.

Приклад.

# Python. Робота з файлами
# Метод close()

# 1. Відкрити текстовий файл для читання
f1 = open('myfile1.txt', 'rt')

# Обробка даних у файлі
# ...

# Закрити файл методом close()
f1.close()

# 2. Відкрити бінарний файл для запису
f2 = open('myfile2.bin', 'wb')

# Запис даних у файл
# ...

# Закрити бінарний файл методом close()
f2.close()

 

4.2. Властивість closed. Визначення, чи відкритий файл

Якщо файловий потік на даний момент відкритий, то closed=False. Якщо файл (потік) закритий, то closed=True.

Приклад.

# Властивість closed
# 1. Відкрити текстовий файл для читання
f1 = open('myfile1.txt', 'rt')

# Вивести значення closed
if f1.closed:
    print("File \'myfile1.txt\' is closed")
else:
    print("File 'myfile1.txt' is opened")

# Закрити файл методом close()
f1.close()

# Повторно вивести значення closed
if f1.closed:
    print("File \'myfile1.txt\' is closed")
else:
    print("File 'myfile1.txt' is opened")

Результат роботи програми

File 'myfile1.txt' is opened
File 'myfile1.txt' is closed

 

4.3. Метод fileno(). Отримати дескриптор файлу

Метод fileno() повертає основний дескриптор файлу, який має цілочисельне значення (якщо такий існує). Якщо файловий об’єкт не використовує дескриптор, то повертається OSError.

Приклад.

# Метод fileno()
# 1. Відкрити текстовий файл для читання
f1 = open('myfile1.txt', 'rt')

# 2. Відкрити двійковий файл для читання
f2 = open('myfile1.bin', 'rb')

# 3. Вивести дескриптор, що зв'язаний з об'єктом f1
d1 = f1.fileno()
print("f1.fileno() = ", d1)

# 4. Вивести дескриптор, що зв'язаний з об'єктом f2
d2 = f2.fileno()
print("f2.fileno() = ", d2)

# Закрити файл методом close()
f1.close()
f2.close()

Результат роботи програми

f1.fileno() = 3
f2.fileno() = 4

 

4.4. Метод flush(). Очищення буферу

Метод flush() очищає буфери запису потоку, де їх можна застосувати. Буфер очищується одним з двох способів:

  • коли відбувається закриття файлу методом close();
  • коли потрібно не закриваючи файл виштовхнути дані з буферу з допомогою методу flush().

Приклад.

# Метод flush(). Очищення буферу
# 1. Відкрити текстовий файл для читання
f1 = open('myfile1.txt', 'rt')

# Прочитати файл f1 повністю,
# результат у масиві рядків Lines
Lines = f1.readlines()

# Вивести масив Lines на екран
for item in Lines:
    print(item)

# Очистити буфер
f1.flush()

# Закрити файл методом close()
f1.close()

Результат роботи програми

#include <iostream.h>

using namespace std;

void main()
{
    cout << "Hello world!" << endl;
}

 

4.5. Метод isatty(). Визначення інтерактивного файлового потоку

Метод isatty() дозволяє визначити чи файловий потік є інтерактивний, тобто отримується з терміналу чи tty-пристрою.

# Метод isatty()
# 1. Відкрити текстовий файл для читання
f1 = open('myfile1.txt', 'rt')

# 2. Визначити, чи потік, зв'язаний з об'єктом f1,
#   є інтерактивним.
if f1.isatty():
    print('The stream f1 is interactive.')
else:
    print('The stream f1 is not interactive')

f1.close()

Результат виконання програми

The stream f1 is not interactive

 

4.6. Метод readable(). Визначити, чи файловий потік може бути прочитаний

 

# Метод readable() - визначає, чи файловий потік може бути прочитаний
# 1. Відкрити текстовий файл для читання
f1 = open('myfile1.txt', 'rt')

# 2. Перевірити, чи можна прочитати файл
if f1.readable():
    # якщо можна, то зчитати весь файл
    s = f1.read()

    # вивести повідомлення, що файл прочитано
    print("File is read.")
else:
    print("Cannot read the file.")

f1.close()

Результат виконання програми

File is read.

 

4.7 Метод readline(). Читання рядка з файлу

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

Згідно документації Python загальна форма використання методу наступна:

s = readline(size=-1)

де

  • s – прочитаний з файлу рядок;
  • size – задає максимально можливу кількість байт, що можуть бути прочитані за один раз.

Приклад. У прикладі демонструється читання текстового файлу.

# Python. Робота з файлами
# Метод readline()

# Прочитати текстовий файл і вивести його на екран
# 1. Відкрити файл у текстовому режимі
f1 = open('myfile1.txt', 'r')

# 2. Цикл читання рядків
print("Content of file \'myfile1.txt\'")
print()

s = f1.readline() # метод readline()

# пустий рядок '' означає кінець файлу
while s!='':
    print(s)
    s = f1.readline() # метод readline()

f1.close()

Результат роботи програми. Виводиться вміст файлу (програма на C++, що виводить “Hello world!” на екран).

Content of file 'myfile1.txt'

#include <iostream.h>

using namespace std;

void main()
{
    cout << "Hello world!" << endl;
}

 

4.8. Метод readlines(). Прочитати усі рядки з файлу

Метод readlines() дозволяє прочитати та повернути список рядків з файлового потоку.

Згідно з документацією загальна форма методу наступна:

strings = readlines(hint = -1)

де

  • strings – список рядків, які прочитані. Рядки розділяються на основі символу нового рядка ‘\n’;
  • hint – підказка, яка задає максимально можливий розмір усіх рядків, що прочитані. Іншими словами, читається така кількість рядків, сумарна довжина яких не перевищує hint.

Приклад.

# Метод readlines() - читання рядків з файлу
# 1. Прочитати всі рядки з файлу
# 1.1. Відкрити текстовий файл для читання
f1 = open('myfile1.txt', 'rt')

# 1.2. Зчитати рядки у strings
strings = f1.readlines()

# 1.3. Вивести усі рядки для контролю
print("The content of file 'myfile1.txt'.")

# Вивести кількість рядків у файлі
print("Number of lines in file: ", len(strings))
print()

# Вивести вміст файлу порядково
for s in strings:
    # забрати зайвий символ '\n' у рядках
    s = s.rstrip()
    print(s)

# 1.4. Закрити файл
f1.close()

# ----------------------------------------------
# 2. Метод readlines() - прочитати обмежену кількість рядків з файлу
# 2.1. Відкрити файл для читання
f1 = open('myfile1.txt', 'rt')

# 2.2. Зчитати обмежену кількість рядків, сума байт яких
#      не перевищує 50
strings2 = f1.readlines(50)

# 2.3. Закрити файл
f1.close()

# 2.4. Вивести список рядків strings2
print("----------------------------------")
print("List strings2:")
print()

for s in strings2:
    s = s.rstrip() # забрати '\n'
    print(s)

Результат роботи програми

The content of file 'myfile1.txt'.
Number of lines in file: 7

#include <iostream.h>

using namespace std;

void main()
{
    cout << "Hello world!" << endl;
}
----------------------------------
List strings2:

#include <iostream.h>

using namespace std;

void main()

 

4.9. Метод seek(). Позиціонування покажчика читання/запису на задану кількість байт

Метод seek() використовується для зміни позиції потоку на задану величину. Зміна задається в байтах. Згідно документації Python загальна форма використання методу наступна:

p = f.seek(offset[, whence])

тут

  • f – файловий об’єкт;
  • p – абсолютна позиція у файлі
  • offset – цілочисельне значення, що рівне кількості байт, на які потрібно зсунути покажчик. Наприклад, якщо offset = 3, то покажчик зсувається на 3 байти до кінця файлу. Якщо offset = -2, то покажчик зсувається на 2 байти до початку файлу;
  • whence – визначає множину значень, які може приймати offset. Параметр whence може приймати одне з трьох значень:
    1. whence = SET_SEEK або whence = 0 (значення за замовчуванням) – визначає початок потоку. У цьому випадку для offset встановлено діапазон можливих значень offset>=0.
    2. whence = SET_CUR або whence = 1 – визначає поточну позицію потоку. У цьому випадку offset може бути додатнім і від’ємним.
    3. whence = SET_END або whence = 2 – кінець потоку. Як правило, значення offset від’ємне.

Приклад.

# Метод seek() - зсунути покажчик читання на задану кількість байт
# 1. Записати у файл рядок 'abcdefghijklmnop'
f1 = open('myfile10.txt', 'wt')

f1.write('abcdefghijklmnop')

# 2. Закрити файл
f1.close()

# 3. Відкрити файл для читання
f1 = open('myfile10.txt', 'rt')

# 4. Зчитати з файлу слово 'def'
# 4.1. Перемістити покажчик на 'd'
p = f1.seek(3, 0) # p - поточна нова позиція
print("p = ", p) # p = 3

# 4.2. Зчитати 3 символи в рядку
s = f1.readline(3) # s = 'def'
print("s = ", s)

# 5. Зсунути покажчик на початок файлу
p2 = f1.seek(0, 0) # p2 = 0
print("p2 = ", p2)

# 6. Зсунути покажчик на кінець файлу
p3 = f1.seek(0, 2)
print("p3 = ", p3) # p3 = 16 - абсолютна позиція

f1.close()

Результат виконання програми

p = 3
s = def
p2 = 0
p3 = 16

 

4.10. Метод seekable(). Визначення підтримки випадкового доступу

Метод seekable() визначає, чи підтримує файловий потік довільний доступ, який передбачає використання функцій seek(), tell(), truncate(). Загальна форма використання методу наступна

res = f.seekable()

де

  • f – файловий об’єкт;
  • res – результат (True або False). Якщо res = True, то файл, що зв’язаний з файловим об’єктом f підтримує довільний доступ. Якщо res = False, то спроба використання функцій seek(), tell(), truncate() згенерує виключну ситуацію OSError.

Приклад.

# Метод seekable() - перевірка, чи підтримує файл довільний доступ
# 1. Бінарний файл
f2 = open('myfile2.bin', 'rb')

if (f2.seekable()):
    print('File "myfile2.bin". Random access = True')
else:
    print('File "myfile2.bin". Random access = False')

f2.close()

# 2. Текстовий файл
f1 = open('myfile1.txt', 'rt')

if (f1.seekable()):
    print('File "myfile2.txt". Random access = True')
else:
    print('File "myfile2.txt". Random access = False')

f1.close()

Результат роботи програми

File "myfile2.bin". Random access = True
File "myfile2.txt". Random access = True

 

4.11. Метод tell(). Повернути поточну позицію покажчика читання/запису

Метод tell() повертає поточну позицію в потоці. Загальна форма використання методу tell() наступна

position = f.tell()

де

  • f – файловий об’єкт (потік), для якого визначається поточна позиція;
  • position – позиція покажчика читання/запису (цілочисельне значення).

Приклад.

# Метод seek() - зсунути покажчик читання на задану кількість байт
# 1. Записати у файл рядок 'abcdefghijklmnop'
f1 = open('myfile10.txt', 'wt')

f1.write('abcdefghijklmnop')

# 2. Вивести поточну позицію
p = f1.tell()
print("p = ", p) # p = 16

# 2. Закрити файл
f1.close()

# 3. Відкрити файл для читання
f1 = open('myfile10.txt', 'rt')

# 3.1. Вивести поточну позицію
p2 = f1.tell()
print("p2 = ", p2) # p2 = 0

# 3.2. Змістити позицію на 5 символів до кінця файлу
f1.seek(5, 0)
p3 = f1.tell() # отримати поточну позицію
print("p3 = ", p3) # p3 = 5

f1.close()

Результат роботи програми

p = 16
p2 = 0
p3 = 5

 

4.12. Метод truncate(). Змінити розмір файлу

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

Згідно з документацією, загальна форма використання методу наступна

size = f.truncate(newSize = None)

тут

  • f – файловий потік;
  • newSize – новий розмір файлу, який встановлюється. Якщо newSize менше поточного розміру, то дані в файлі урізаються з кінця файлу. Якщо newSize більше поточного розміру, то дані доповнюються нульовими значеннями ‘\x00’. За замовчуванням значення newSize = None.

Виклик truncate() без параметрів (newSize=None за замовчуванням) поверне поточний розмір файлу в байтах.

Приклад.

# Метод truncate() - змінити розмір файлу (файлового потоку)
# 1. Запис файлу, зміна розміру файлу
# 1.1. Записати у файл рядок '01234567890' - розмір файлу 10 байт
f1 = open('myfile11.txt', 'wt')

f1.write('0123456789') # розмір 10 байт

# 1.2. Вивести розмір файлу - виклик truncate() без параметру
size = f1.truncate()
print('size = ', size) # size = 10

# 1.3. Зменшити файл на 2 байти
size2 = f1.truncate(8)
print('size2 = ', size2) # size2 = 8

# 1.4. Збільшити розмір файлу до 15 байт
size3 = f1.truncate(15)
print('size3 = ', size3) # size3 = 15

# 1.4. Закрити файл
f1.close()

# 2. Прочитати записаний рядок з файлу
# 2.1. Відкрити файл для читання
f2 = open('myfile11.txt', 'rt')

# 2.2. Прочитати рядок з файлу та вивести його на екран
s = f2.readline() # s = '01234567\x00\x00\x00\x00\x00\x00\x00'
print('s=', s, '.')

f2.close()

Результат роботи програми

size = 10
size2 = 8
size3 = 15
s= 01234567       .

 

4.13. Метод writable(). Визначити, чи файловий потік підтримує запис

Метод writable() визначає, чи потік підтримує запис. Згідно з документацією загальна форма використання методу наступна

fWrite = f.writable()

тут

  • f – файловий потік;
  • fWrite – результат. Якщо fWrite=True, то файловий потік підтримує запис. Можна використовувати функції write() та truncate(). Якщо fWrite=False, то використання функцій write() та truncate() згенерує виключення OSError.

Приклад.

# Метод writable()
# 1. Відкрити файл для читання та перевірити результат
f1 = open('myfile1.bin', 'rb') # двійковий режим

if f1.writable():
    print("File object f1 supports writing.")
else:
    print("File object f1 doesn't support writing.")

f1.close()

# 2. Відкрити файл для запису та перевірити результат
f1 = open('myfile12.txt', 'wt') # Текстовий режим

if f1.writable():           # якщо f1 допускає запис
    f1.write('Hello world!') # записати у файл
    print("Write to f1: 'Hello world!' - OK!")
else:
    print("File object f1 doesn't support writing")

f1.close()

Результат роботи програми

File object f1 doesn't support writing.
Write to f1: 'Hello world!' - OK!

 

4.14. Метод writelines(). Запис списку рядків у файл

Метод writelines() реалізує запис списку рядків у потік. Загальна форма використання методу наступна:

f.writelines(lines)

тут

  • f – відкритий для запису файловий потік;
  • lines – список рядків, який потрібно записати у файл. Рядки додаються у тому вигляді, як вони представлені в списку lines, тобто ніякі додаткові символи-розділювачі не додаються. Якщо, в подальшому потрібно зчитувати ці рядки з файлу, то необхідно кожного рядка в списку додати символ-розділювач (наприклад ‘\n’ або інший символ).

Приклад.

# Метод writelines() - запис списку рядків у файл
# Випадок 1. У список рядків не додано символ кінця рядка
# 1.1. Відкрити файл для запису в текстовому режимі
f1 = open('myfile13.txt', 'wt') # текстовий режим

# 1.2. Задано назви пори року - без символу кінця рядка
Seasons = [ 'Winter', 'Spring', 'Summer', 'Autumn']

# 1.3. Записати в файл масив рядків без використання символу '\n'
f1.writelines(Seasons) # У файлі текст: 'WinterSpringSummerAutumn'

# 1.4. Закрити файл 'myfile13.txt'
f1.close()

# ----------------------------------------------------
# Випадок 2. У кожен рядок списку додано символ кінця рядка
# 2.1. Відкрити новий файл для запису в текстовому режимі
f2 = open('myfile14.txt', 'w')

# 2.2. Задати новий список назв пори року - з символом '\n'
Seasons2 = [ 'Winter\n', 'Spring\n', 'Summer\n', 'Autumn\n' ]

# 2.3. Записати у файл 'myfile14.txt'
f2.writelines(Seasons2) # У файлі кожен елемент списку в новому рядку

# 2.4. Закрити файл
f2.close()

Вміст файлу myfile13.txt

WinterSpringSummerAutumn

Вміст файлу myfile14.txt

Winter
Spring
Summer
Autumn

 


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