Пособие. Пособие по Python. Название Описание
Скачать 0.75 Mb.
|
try : file = open ( "myfile.txt" ) try : s = file .readlines() ( s ) finally : file .close() except FileNotFoundError: ( "Невозможно открыть файл" ) Мы здесь создаем вложенный блок try, в который помещаем критический текст программы при работе с файлом и далее блок finally, который будет выполнен при любом стечении обстоятельств, а значит, файл гарантированно будет закрыт. Или же, забегая немного вперед, отмечу, что часто для открытия файла пользуются так называемым менеджером контекста, когда файл открывают при помощи оператора with: try : with open ( "myfile.txt" , "r" ) as file : # file = open("myfile.txt") s = file .readlines() ( s ) except FileNotFoundError: ( " Невозможно открыть файл" ) При таком подходе файл закрывается автоматически после выполнения всех инструкций внутри этого менеджера. В этом можно убедиться, выведем в консоль флаг, сигнализирующий закрытие файла: finally : ( file .closed) Запустим программу, видите, все работает также и при этом файл автоматически закрывается. Даже если произойдет критическая ошибка, например, пропишем такую конструкцию: ( int (s) ) то, как видим, файл все равно закрывается. Вот в этом удобство такого подхода при работе с файлами. Запись информации в файл Теперь давайте посмотрим, как происходит запись информации в файл. Во-первых, нам нужно открыть файл на запись, например, так: file = open ( "out.txt" , "w" ) и далее вызвать метод write: file .write( "Hello World!" ) В результате у нас будет создан файл out.txt со строкой «Hello World!». Причем, этот файл будет располагаться в том же каталоге, что и файл с текстом программы на Python. Далее сделаем такую операцию: запишем метод write следующим образом: file .write( "Hello" ) И снова выполним эту программу. Смотрите, в нашем файле out.txt прежнее содержимое исчезло и появилось новое – строка «Hello». То есть, когда мы открываем файл на запись в режимах w, wt, wb, то прежнее содержимое файла удаляется. Вот этот момент следует всегда помнить. Теперь посмотрим, что будет, если вызвать метод write несколько раз подряд: file .write( "Hello1" ) file .write( "Hello2" ) file .write( "Hello3" ) Смотрите, у нас в файле появились эти строчки друг за другом. То есть, здесь как и со считыванием: объект file записывает информацию, начиная с текущей файловой позиции, и автоматически перемещает ее при выполнении метода write. Если мы хотим записать эти строчки в файл каждую с новой строки, то в конце каждой пропишем символ переноса строки: file .write( "Hello1 \n " ) file .write( "Hello2 \n " ) file .write( "Hello3 \n " ) Далее, для дозаписи информации в файл, то есть, записи с сохранением предыдущего содержимого, файл следует открыть в режиме ‘a’: file = open ( "out.txt" , "a" ) Тогда, выполняя эту программу, мы в файле увидим уже шесть строчек. И смотрите, в зависимости от режима доступа к файлу, мы должны использовать или методы для записи, или методы для чтения. Например, если вот здесь попытаться прочитать информацию с помощью метода read: file .read() то возникнет ошибка доступа. Если же мы хотим и записывать и считывать информацию, то можно воспользоваться режимом a+: file = open ( "out.txt" , "a+" ) Так как здесь файловый указатель стоит на последней позиции, то для считывания информации, поставим его в самое начало: file .seek( 0 ) ( file .read() ) А вот запись данных всегда осуществляется в конец файла. Следующий полезный метод для записи информации – это writelines: file .writelines([ "Hello1 \n " , "Hello2 \n " ]) Он записывает несколько строк, указанных в коллекции. Иногда это бывает удобно, если в процессе обработки текста мы имеем список и его требуется целиком поместить в файл. Чтение и запись в бинарном режиме доступа Что такое бинарный режим доступа? Это когда данные из файла считываются один в один без какой-либо обработки. Обычно это используется для сохранения и считывания объектов. Давайте предположим, что нужно сохранить в файл вот такой список: books = [ ( "Евгений Онегин" , "Пушкин А.С." , 200 ) , ( "Муму" , "Тургенев И.С." , 250 ) , ( "Мастер и Маргарита" , "Булгаков М.А." , 500 ) , ( "Мертвые души" , "Гоголь Н.В." , 190 ) ] Откроем файл на запись в бинарном режиме: file = open ( "out.bin" , "wb" ) Далее, для работы с бинарными данными подключим специальный встроенный модуль pickle: import pickle И вызовем него метод dump: pickle .dump(books , file ) Все, мы сохранили этот объект в файл. Теперь прочитаем эти данные. Откроем файл на чтение в бинарном режиме: file = open ( "out.bin" , "rb" ) и далее вызовем метод load модуля pickle: bs = pickle .load( file ) Все, теперь переменная bs ссылается на эквивалентный список: ( bs ) Аналогичным образом можно записывать и считывать сразу несколько объектов. Например, так: import pickle book1 = [ "Евгений Онегин" , "Пушкин А.С." , 200 ] book2 = [ "Муму" , "Тургенев И.С." , 250 ] book3 = [ "Мастер и Маргарита" , "Булгаков М.А." , 500 ] book4 = [ "Мертвые души" , "Гоголь Н.В." , 190 ] try : file = open ( "out.bin" , "wb" ) try : pickle .dump(book1 , file ) pickle .dump(book2 , file ) pickle .dump(book3 , file ) pickle .dump(book4 , file ) finally : file .close() except FileNotFoundError: ( " Невозможно открыть файл" ) А, затем, считывание в том же порядке: file = open ( "out.bin" , "rb" ) b1 = pickle .load( file ) b2 = pickle .load( file ) b3 = pickle .load( file ) b4 = pickle .load( file ) ( b1 , b2 , b3 , b4 , sep = " \n " ) Вот так в Python выполняется запись и считывание данных из файла. |