НОЧУ ДПО "Национальный открытый университет "ИНТУИТ"
Опубликован: 24.01.2021 | Доступ: свободный | Студентов: 2489 / 106 | Длительность: 03:57:00
Лекция 9:

Файлы

< Лекция 1 || Лекция 9: 1234

Смотреть на youtube

Для решения задач, возникающих в прикладной области, программист ищет подходящий алгоритм и подходящие структуры данных. Списки, кортежи, словари, множества - эти структуры данных используются во многих задачах при реализации алгоритмов. Конечно, часто используются и другие структуры данных, задаваемые в пакетах Python или специально спроектированные с учетом особенности решаемой задачи. Все эти структуры данных создаются в процессе выполнения программы и исчезают по окончании сеанса работы с программой.

Но мощь компьютера во многом основана на том, что данные, создаваемые в процессе работы компьютера, можно сохранять во внешней памяти и затем многократно использовать их в разнообразных программах в качестве входных данных. Компьютер - это машина по производству и переработке данных.

Объекты, хранящие данные во внешней памяти, называются файлами. Для большинства практических задач источником входных данных являются файлы. Данные, созданные в результате выполнения программы, также сохраняются в файлах. Файлы Python разделяются на два класса - бинарные и текстовые. Бинарный файл - это последовательность байтов. Текстовый файл - это последовательность строк текста.

При выводе результатов в файл данные, представленные разнообразными структурами данных, преобразуются в последовательность байтов или строк текста в зависимости от типа файла.

При вводе исходных данных из файла происходит обратное преобразование - последовательность байтов или строк текста преобразуются в нужный формат, задаваемый соответствующей структурой данных.

Как и полагается, Python позволяет работать с файлами - бинарными и текстовыми. В этой лекции мы рассмотрим работу с текстовыми файлами - наиболее часто используемым типом файлов. Мы рассмотрим, как файлы создаются, как сохраняются в файлах данные, представленные различными структурами данных, как данные, представленные в файле, преобразуются в данные соответствующих структур.

Создание файла. Открытие и закрытие файла

Когда мы говорим о файлах, то следует различать:

  • Физический файл - коллекцию данных на внешнем носителе, имеющую имя и сохраняемую в некотором каталоге. Обычно, в качестве внешнего носителя выступает жесткий диск, встроенный в компьютер.
  • Логический файл - объект языка.

При открытии файла устанавливается связь между логическим и физическим файлом. Операции, выполняемые в программе над логическим файлом, фактически выполняются над физическим файлом. При закрытии файла связь между логическим файлом и физическим файлом разрывается.

Файл, как объект языка, создается при вызове метода open. В процессе выполнения метода устанавливается связь между логическим и физическим файлами.

Метод имеет два строковых аргумента - первый задает путь к файлу, второй - его статус. Если в качестве первого аргумента указать только имя файла с соответствующим уточнением txt или bin, то файл ищется в том же каталоге, где находится выполняемая программа.

Статус открываемого файла задается строкой обычно из одного символа, хотя допускается и комбинация символов. Символы, задающие статус, имеют следующее значение:

r - от (read) файл открывается для чтения. Физический файл должен существовать в указанном месте.

w - от (write) физический файл открывается для записи. Если файл существует, то он перезаписывается, - старые записи удаляются. Если файл не существует, то он создается;

a - от (append) файл открывается для добавления в конец файла. Новые записи добавляются в конец существующего файла. Если файл не существует, то он создается.

x - новый файл, создаваемый для записи. Если файл существует, то возникнет ошибка.

b - от (binary) задает тип бинарного файла. Символ задается в комбинации с другими символами статуса. Комбинация 'b + r' или просто 'br' открывает существующий бинарный файл для чтения. Комбинация 'b + w' ('bw') в существующем файле удаляет содержимое, так что длина физического файла становится равной нулю байтов.

t - от (text) задает тип текстового файла. По умолчанию файл считается текстовым и имеет статус 'rt'.

Открыв файл, в зависимости от статуса, над ним выполняются те или иные операции по чтению или записи данных. Для текстовых файлов работа идет со строками текста, для бинарных файлов - с байтами. По окончании работы следует файл закрыть, выполнив метод close.

Хотя Python, будучи интерпретатором, чаще всего автоматически закрывает файл по окончании работы с ним, но правильная стратегия работы с файлами во всех языках программирования состоит в том, что следует явно закрывать файл, вызывая метод close, не надеясь на действия по умолчанию. При выполнении этого метода закрывается физический файл, программа освобождает этот ресурс и физический файл может использоваться в других приложениях.

Операции над файлом, будучи операциями над внешним носителем, являются медленными операциями в сравнении с операциями над оперативной памятью компьютера. Поэтому общепринятой практикой при работе с файлами является буферизация данных, когда при открытии файла в оперативной памяти создается буфер, в который пишутся данные, помещаемые в файл. По заполнении буфера данные из буфера переносятся во внешнюю память. Буферизация позволяет ускорить выполнение операций над файлом.

Нужно учесть, что по окончании работы с файлом часть данных может находиться в буфере. Как правило, при закрытии файла буфер автоматически освобождается, перенося данные из буфера в файл. Поскольку полной гарантии в освобождении буфера нет, многое зависит от исполняемой среды программирования, то перед закрытием файла следует явно выполнить метод flush. Этот метод специально спроектирован для переноса в файл данных из буфера, возможно используемого при работе с файлом.

Рассмотрим пример создания файлов с разным статусом и работы с ними на примере файлов, содержащих несколько записей со строковыми данными:

#Работа с текстовыми файлами
def test1():
    #Открытие файлов
    #запись
    one = open("One.txt", 'w')
    one.write("запись_1" + "\n")
    one.write("запись_2" + "\n")
    one.close()
    print("файл One создан!")
    #чтение
    one = open("One.txt", 'r')
    print(one.readline())
    print(one.readline()) 
    one.close()
    #перезапись
    one = open("One.txt", 'w')
    one.write("запись_3" + "\n")
    one.write("запись_4" + "\n")
    one.close()
    one = open("One.txt", 'r')
    print(one.readline())
    print(one.readline())
    one.close()
    #создание нового файла
    two = open("Two.txt", 'x')
    two.write("запись_5" + "\n")
    two.write("запись_6" + "\n")
    two.close()
    print("файл Two создан!")
    #дозапись
    two = open("Two.txt", 'a')
    two.write("запись_7"+ "\n")
    two.write("запись_8" + "\n")
    two.close() 
    #чтение
    two = open("Two.txt", 'r')
    print(two.readline())
    print(two.readline())
    print(two.readline())
    print(two.readline())
    two.flush()
    two.close()
test1()

Результаты работы:


В каталоге, где хранится программный код, созданы два текстовых файла с именами One и Two. В файле One две строки: запись_3 и запись_4. В файле Two - четыре строки.

Заметьте, при повторном запуске этого теста возникнет ошибка, если предварительно не удалить созданный файл Two.

< Лекция 1 || Лекция 9: 1234
Алексей Авилов
Алексей Авилов

Неужели не нашлось русских специалистов, чтобы записать курс по пайтону ? Да, можно включить переводчик и слушать с переводом, но это что? Это кто-то считает хорошим и понятным курсом для начинающих? 

Елена Лаптева
Елена Лаптева

Думаю. что не смогу его закончить. Хотелось предупредить других - не тратьте зря время, ищите другой курс.