СРО 8 Алгоритмизация и Программирование. Close() Открытие и закрытие файла
Скачать 42.16 Kb.
|
При работе с файлами необходимо соблюдать некоторую последовательность операций: Открытие файла с помощью метода open() Чтение файла с помощью метода read() или запись в файл посредством метода write() Закрытие файла методом close() Открытие и закрытие файла Чтобы начать работу с файлом, его надо открыть с помощью функции open(), которая имеет следующее формальное определение:
Первый параметр функции представляет путь к файлу. Путь файла может быть абсолютным, то есть начинаться с буквы диска, например, C://somedir/somefile.txt. Либо можно быть относительным, например, somedir/somefile.txt - в этом случае поиск файла будет идти относительно расположения запущенного скрипта Python. Второй передаваемый аргумент - mode устанавливает режим открытия файла в зависимости от того, что мы собираемся с ним делать. Существует 4 общих режима: r (Read). Файл открывается для чтения. Если файл не найден, то генерируется исключение FileNotFoundError w (Write). Файл открывается для записи. Если файл отсутствует, то он создается. Если подобный файл уже есть, то он создается заново, и соответственно старые данные в нем стираются. a (Append). Файл открывается для дозаписи. Если файл отсутствует, то он создается. Если подобный файл уже есть, то данные записываются в его конец. b (Binary). Используется для работы с бинарными файлами. Применяется вместе с другими режимами - w или r. После завершения работы с файлом его обязательно нужно закрыть методом close(). Данный метод освободит все связанные с файлом используемые ресурсы. Например, откроем для записи текстовый файл "hello.txt":
При открытии файла или в процессе работы с ним мы можем столкнуться с различными исключениями, например, к нему нет доступа и т.д. В этом случае программа выпадет в ошибку, а ее выполнение не дойдет до вызова метода close, и соответственно файл не будет закрыт. В этом случае мы можем обрабатывать исключения:
В данном случае вся работа с файлом идет во вложенном блоке try. И если вдруг возникнет какое-либо исключение, то в любом случае в блоке finally файл будет закрыт. Однако есть и более удобная конструкция - конструкция with:
Эта конструкция определяет для открытого файла переменную file_obj и выполняет набор инструкций. После их выполнения файл автоматически закрывается. Даже если при выполнении инструкций в блоке with возникнут какие-либо исключения, то файл все равно закрывается. Так, перепишем предыдущий пример:
Запись в текстовый файл Чтобы открыть текстовый файл на запись, необходимо применить режим w (перезапись) или a (дозапись). Затем для записи применяется метод write(str), в который передается записываемая строка. Стоит отметить, что записывается именно строка, поэтому, если нужно записать числа, данные других типов, то их предварительно нужно конвертировать в строку. Запишем некоторую информацию в файл "hello.txt":
Если мы откроем папку, в которой находится текущий скрипт Python, то увидем там файл hello.txt. Этот файл можно открыть в любом текстовом редакторе и при желании изменить. Теперь дозапишем в этот файл еще одну строку:
Дозапись выглядит как добавление строку к последнему символу в файле, поэтому, если необходимо сделать запись с новой строки, то можно использовать эскейп-последовательность "\n". В итоге файл hello.txt будет иметь следующее содержимое:
Еще один способ записи в файл представляет стандартный метод print(), который применяется для вывода данных на консоль:
Для вывода данных в файл в метод print в качестве второго параметра передается название файла через параметр file. А первый параметр представляет записываемую в файл строку. Чтение файла Для чтения файла он открывается с режимом r (Read), и затем мы можем считать его содержимое различными методами: readline(): считывает одну строку из файла read(): считывает все содержимое файла в одну строку readlines(): считывает все строки файла в список Например, считаем выше записанный файл построчно:
Несмотря на то, что мы явно не применяем метод readline() для чтения каждой строки, но в при переборе файла этот метод автоматически вызывается для получения каждой новой строки. Поэтому в цикле вручную нет смысла вызывать метод readline. И поскольку строки разделяются символом перевода строки "\n", то чтобы исключить излишнего переноса на другую строку в функцию print передается значение end="". Теперь явным образом вызовем метод readline() для чтения отдельных строк:
Консольный вывод: hello world good bye, world Метод readline можно использовать для построчного считывания файла в цикле while:
Если файл небольшой, то его можно разом считать с помощью метода read():
И также применим метод readlines() для считывания всего файла в список строк:
При чтении файла мы можем столкнуться с тем, что его кодировка не совпадает с ASCII. В этом случае мы явным образом можем указать кодировку с помощью параметра encoding:
Теперь напишем небольшой скрипт, в котором будет записывать введенный пользователем массив строк и считывать его обратно из файла на консоль:
Пример работы программы: Введите строку 1: hello Введите строку 2: world peace Введите строку 3: great job Введите строку 4: Python Считанные сообщения hello world peace great job Python Одним из распространенных файловых форматов, которые хранят в удобном виде информацию, является формат csv. Каждая строка в файле csv представляет отдельную запись или строку, которая состоит из отдельных столбцов, разделенных запятыми. Собственно поэтому формат и называется Comma Separated Values. Но хотя формат csv - это формат текстовых файлов, Python для упрощения работы с ним предоставляет специальный встроенный модуль csv. Рассмотрим работу модуля на примере:
В файл записывается двухмерный список - фактически таблица, где каждая строка представляет одного пользователя. А каждый пользователь содержит два поля - имя и возраст. То есть фактически таблица из трех строк и двух столбцов. При открытии файла на запись в качестве третьего параметра указывается значение newline="" - пустая строка позволяет корректно считывать строки из файла вне зависимости от операционной системы. Для записи нам надо получить объект writer, который возвращается функцией csv.writer(file). В эту функцию передается открытый файл. А собственно запись производится с помощью метода writer.writerows(users) Этот метод принимает набор строк. В нашем случае это двухмерный список. Если необходимо добавить одну запись, которая представляет собой одномерный список, например, ["Sam", 31], то в этом случае можно вызвать метод writer.writerow(user) В итоге после выполнения скрипта в той же папке окажется файл users.csv, который будет иметь следующее содержимое:
Для чтения из файла нам наоборот нужно создать объект reader:
При получении объекта reader мы можем в цикле перебрать все его строки: Tom - 28 Alice - 23 Bob - 34 Sam - 31 Работа со словарямиВ примере выше каждая запись или строка представляла собой отдельный список, например, ["Sam", 31]. Но кроме того, модуль csv имеет специальные дополнительные возможности для работы со словарями. В частности, функция csv.DictWriter() возвращает объект writer, который позволяет записывать в файл. А функция csv.DictReader() возвращает объект reader для чтения из файла. Например:
Запись строк также производится с помощью методов writerow() и writerows(). Но теперь каждая строка представляет собой отдельный словарь, и кроме того, производится запись и заголовков столбцов с помощью метода writeheader(), а в метод csv.DictWriter в качестве второго параметра передается набор столбцов. При чтении строк, используя названия столбцов, мы можем обратиться к отдельным значениям внутри строки: row["name"]. Бинарные файлы в отличие от текстовых хранят информацию в виде набора байт. Для работы с ними в Python необходим встроенный модуль pickle. Этот модуль предоставляет два метода: dump(obj, file): записывает объект obj в бинарный файл file load(file): считывает данные из бинарного файла в объект При открытии бинарного файла на чтение или запись также надо учитывать, что нам нужно применять режим "b" в дополнение к режиму записи ("w") или чтения ("r"). Допустим, надо надо сохранить два объекта:
С помощью функции dump последовательно записываются два объекта. Поэтому при чтении файла также последовательно посредством функции load мы можем считать эти объекты. Консольный вывод программы: Имя: Tom Возраст: 28 Подобным образом мы можем сохранять и извлекать из файла наборы объектов:
В зависимости от того, какой объект мы записывали функцией dump, тот же объект будет возвращен функцией load при считывании файла. Консольный вывод: Имя: Tom Возраст: 28 Женат(замужем): True Имя: Alice Возраст: 23 Женат(замужем): False Имя: Bob Возраст: 34 Женат(замужем): False Для работы с бинарными файлами в Python может применяться еще один модуль - shelve. Он сохраняет объекты в файл с определенным ключом. Затем по этому ключу может извлечь ранее сохраненный объект из файла. Процесс работы с данными через модуль shelve напоминает работу со словарями, которые также используют ключи для сохранения и извлечения объектов. Для открытия файла модуль shelve использует функцию open():
Где параметр flag может принимать значения: c: файл открывается для чтения и записи (значение по умолчанию). Если файл не существует, то он создается. r: файл открывается только для чтения. w: файл открывается для записи. n: файл открывается для записи Если файл не существует, то он создается. Если он существует, то он перезаписывается Для закрытия подключения к файлу вызывается метод close():
Либо можно открывать файл с помощью оператора with. Сохраним и считаем в файл несколько объектов:
Запись данных предполагает установку значения для определенного ключа:
А чтение из файла эквивалентно получению значения по ключу:
В качестве ключей используются строковые значения. При чтении данных, если запрашиваемый ключ отсутствует, то генерируется исключение. В этом случае перед получением мы можем проверять на наличие ключа с помощью оператора in:
Также мы можем использовать метод get(). Первый параметр метода - ключ, по которому следует получить значение, а второй - значение по умолчанию, которое возвращается, если ключ не найден.
Используя цикл for, можно перебрать все значения из файла:
Метод keys() возвращает все ключи из файла, а метод values() - все значения:
Еще один метод items() возвращает набор кортежей. Каждый кортеж содержит ключ и значение.
Консольный вывод: ("London", "Great Britain") ("Paris", "France") ("Berlin", "Germany") ("Madrid", "Spain") Обновление данных Для изменения данных достаточно присвоить по ключу новое значение, а для добавления данных - определить новый ключ:
Удаление данных Для удаления с одновременным получением можно использовать функцию pop(), в которую передается ключ элемента и значение по умолчанию, если ключ не найден:
Также для удаления может применяться оператор del:
Для удаления всех элементов можно использовать метод clear():
Ряд возможностей по работе с каталогами и файлами предоставляет встроенный модуль os. Хотя он содержит много функций, рассмотрим только основные из них: mkdir(): создает новую папку rmdir(): удаляет папку rename(): переименовывает файл remove(): удаляет файл Создание и удаление папки Для создания папки применяется функция mkdir(), в которую передается путь к создаваемой папке:
Для удаления папки используется функция rmdir(), в которую передается путь к удаляемой папке:
Переименование файла Для переименования вызывается функция rename(source, target), первый параметр которой - путь к исходному файлу, а второй - новое имя файла. В качестве путей могут использоваться как абсолютные, так и относительные. Например, пусть в папке C://SomeDir/ располагается файл somefile.txt. Переименуем его в файл "hello.txt":
Удаление файла Для удаления вызывается функция remove(), в которую передается путь к файлу:
Существование файла Если мы попытаемся открыть файл, который не существует, то Python выбросит исключение FileNotFoundError. Для отлова исключения мы можем использовать конструкцию try...except. Однако можно уже до открытия файла проверить, существует ли он или нет с помощью метода os.path.exists(path). В этот метод передается путь, который необходимо проверить:
|