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 – буферизация, включенная как для текстовых так и для двоичных файлов. Здесь значение bufferin задает фиксированный размер буфера в байтах.
    • 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’ – файл открывается для записи. Если файл с таким именем уже существует, то предыдущее содержимое файла уничтожается;
  • ‘х’ – файл открывается для эксклюзивного создания. Если такой файл уже существует, то возникает сбой;
  • ‘а’ – открывает файл для записи. Если такой файл уже существует, то открывает файл для добавления (информация записывается от конца файла);
  • ‘b’ – двоичный тип файла. Это значение может быть в сочетании со значениями ‘r’, ‘w’, ‘х’, ‘а’;
  • ‘t’ – текстовый тип файла. Это значение может быть в сочетании с ‘r’, ‘w’, ‘х’, ‘а’. Текстовый тип файла устанавливается по умолчанию;
  • ‘+’ – открыть файл на диске для обновления (чтения/записи);
  • ‘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()

которая разрывает связь с внешним файлом.

Если после вызова функции 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. Для текстовых файлов - ошибка, исключение с сообщением
# "саn'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

 


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