Главная страница
Навигация по странице:

  • Чтение и запись в бинарном режиме доступа

  • Пособие. Пособие по Python. Название Описание


    Скачать 0.75 Mb.
    НазваниеНазвание Описание
    АнкорПособие
    Дата05.10.2021
    Размер0.75 Mb.
    Формат файлаpdf
    Имя файлаПособие по Python.pdf
    ТипДокументы
    #241608
    страница5 из 5
    1   2   3   4   5
    try
    : file
    =
    open
    (
    "myfile.txt"
    )
    try
    : s
    =
    file
    .readlines()
    print
    ( s )
    finally
    : file
    .close()
    except
    FileNotFoundError:
    print
    (
    "Невозможно открыть файл"
    )
    Мы здесь создаем вложенный блок try, в который помещаем критический текст программы при работе с файлом и далее блок finally, который будет выполнен при любом стечении обстоятельств, а значит, файл гарантированно будет закрыт.
    Или же, забегая немного вперед, отмечу, что часто для открытия файла пользуются так называемым менеджером контекста, когда файл открывают при помощи оператора with:
    try
    :
    with
    open
    (
    "myfile.txt"
    ,
    "r"
    )
    as
    file
    :
    # file = open("myfile.txt")
    s
    =
    file
    .readlines()
    print
    ( s )
    except
    FileNotFoundError:
    print
    (
    "
    Невозможно открыть файл"
    )
    При таком подходе файл закрывается автоматически после выполнения всех инструкций внутри этого менеджера. В этом можно убедиться, выведем в консоль флаг, сигнализирующий закрытие файла:
    finally
    :
    print
    (
    file
    .closed)

    Запустим программу, видите, все работает также и при этом файл автоматически закрывается. Даже если произойдет критическая ошибка, например, пропишем такую конструкцию:
    print
    ( 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
    )
    print
    ( 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 ссылается на эквивалентный список:
    print
    ( 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:
    print
    (
    "
    Невозможно открыть файл"
    )
    А, затем, считывание в том же порядке: file
    =
    open
    (
    "out.bin"
    ,
    "rb"
    ) b1
    =
    pickle
    .load(
    file
    ) b2
    =
    pickle
    .load(
    file
    ) b3
    =
    pickle
    .load(
    file
    ) b4
    =
    pickle
    .load(
    file
    )
    print
    ( b1
    ,
    b2
    ,
    b3
    ,
    b4
    ,
    sep
    =
    "
    \n
    "
    )
    Вот так в Python выполняется запись и считывание данных из файла.
    1   2   3   4   5


    написать администратору сайта