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')

# 3. Закрыть файл
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.")

# 3. Закрыть файл
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)

# 5. Сдвинуть указатель на конец файла
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

 


Связанные темы