Файлы. Общие понятия. Открытие/закрытие файла. Функции 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 – буферизация, включенная как для текстовых так и для двоичных файлов. Здесь значение 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
⇑
Связанные темы
⇑