Работа с файлами – неизменная составляющая программирования на любом языке. Если хочется идти дальше калькуляторов и программ типа «Hello, World», то работа с файлами – обязательная составляющая. Причем не только для редактирования изображений, текстов, видео или другой видимой работы. Файлы используются для хранения необходимой для исполнения информации, настроек и так далее.
Поэтому разработчику Python важно понимать, как взаимодействовать с ними, какие бывают типы файлов, какими методами с ними работать, как осуществлять чтение и запись в файл, переименовывать их.
Типы файлов в Python
С точки зрения программирования файл может быть сравнен с сейфом, хранящим ценную информацию. Эти данные там сберегаются в определенном виде и с конкретной структурой, чтобы было легко получить их. А чтобы было понятно, что содержится в этом «сейфе», у него есть имя.
Файлы разделяются на две разновидности:
- Текстовые.
- Бинарные.
Рассмотрим более подробно первый тип.
Текстовые
Это, которые человек может разобрать после открытия. Это может быть не только текст, но и некоторые эмодзи, иные символы, которые есть в таблице. В файлах этого типа хранятся цифры в десятичном виде. Под текстовым файлом подразумевается не только тот, у которого расширение txt, но и любого другого типа, который можно открыть блокнотом и понять, что там написано. Но даже если поменять расширение, он все равно остается текстовым.
Есть еще один формат текстовых файлов, который более сложный – .rtf. Он может содержать форматирование, и этим выгодно отличается от стандартного текстового.
Бинарные
Такие файлы содержат последовательность нулей и единиц. Как правило, представляют собойы последовательность битов. Стандартный формат – .bin.
Независимо от типа файла, с ним возможно выполнение одного из следующего действия:
- Открытие.
- Выполнение (сюда входит запись какой-то информации или ее получение).
- Закрытие файла.
Рассмотрим основные методы, позволяющие осуществить чтение из файла.
Открытие файла
Открытие файла – это процедура получения доступа к содержимому файла, но еще не его чтение или запись. Это в Python делается с помощью метода open. Он используется для открытия любого файла, независимо от того, он текстовый или бинарный.
Используется функция таким образом.
f = open(a, b)
Расшифруем параметры функции:
- a – это имя файла. Включает не только непосредственно имя, но и расширение.
- b – это тип открытия. В Python есть 12 типов открытия файлов.
Приведем таблицу с ними.
Допустим, у нас есть текстовый файл с таким содержимым.
Видим, что он называется «example.txt». Чтобы программа получила к нему доступ, используйте одну из следующих строк кода.
f = open(‘example.txt’,’r’)
fp = open(‘C:/xyz.txt’,’r’)
Оба позволяют выполнить открытие файла в формате чтения. Но отличается место, из которого осуществляется открытие. Так, первая строчка в переменную f записывает объект из файла, находящегося в той же папке, где расположена программа. А вторая строка демонстрирует пример открытия файла в конкретной папке. В нашем случае – на диске c.
Ну и во втором аргументе мы видим, что файл открывается в режиме «только чтение».
А теперь предположим, что нам надо показать, что содержится в нем, пользователю. Для этого используется следующий код.
>>> print(*f)
Обратите внимание на синтаксис. Чтобы показать, что хранится в текстовом документе, используется переменная, которой был присвоен этот объект со звездочкой перед ней.
Если же нужно вывести сам объект, соответствующий файлу, то тогда звездочка не используется. Сам же код такой самый.
Что касается кодировки, то Windows и Linux используют разные: cp1252 и utf-08 соответственно.
Закрытие
Если для открытия текстового документа применяется метод open() то, логично, для закрытия – close(). Это надо делать всегда, если программа не будет с ним больше работать. Если этого не сделать, его след останется в оперативной памяти, и компьютер может начать работать медленнее. В случае с маленькими файлами это не критично, а что если придется открывать большой?
Если присвоить новый файл той же переменной, то закрытие старого произойдет автоматически.
Есть несколько способов осуществления закрытия.
Способ 1
Наиболее легкий способ – просто закрыть файл после того, как с ним будет произведено последнее действие.
f = open(‘example.txt’,’r’)
# процессы, выполняемые над файлом
f.close()
Пока его снова не открыть средствами программы, она уже ничего не сможет с ним сделать, если выполнить последнюю инструкцию.
Способ 2
Приведенный выше способ прост, но имеет недостаток. Если возникает какая-то ошибка, это может привести к сбою в работе программы. Чтобы обработать ошибки при открытии файла, используется комбинация try/finally. В таком случае, если что-то пойдет не так, то программа просто закроет файл, а не аварийно завершит свою работу.
Вот код, как это делается.
f = open(‘example.txt’,’r’)
try:
# работа с файлом
finally:
f.close()
Открытие файла должно осуществиться до того, как создается конструкция try/finally. Потом пишется try, и это начинается обработчик ошибок. Далее пишутся инструкции по работе с этим файлом, после чего finally записывается, и тогда файл закрывается. То есть, синтаксис обработчика стандартный, и ничем принципиально не отличается.
Способ 3
Сделать обработку ошибок значительно легче можно с помощью инструкции with. Она упаковывает в себя сразу несколько задач, в том числе и закрытие, очистку. Очень удобно, поскольку не надо писать несколько строк кода, чтобы закрыть файл в случае неудачи.
with open(‘example.txt’) as f:
# работа с файлом
Операции чтения и записи
Следующий шаг после открытия файла – выполнение операций с ним. Как мы ранее поняли, они бывают двух типов: чтение и запись. Чтобы их выполнить, необходимо использовать функцию, соответствующую конкретной задаче.
read()
После того, как приложение открыло файл в режиме чтения, к нему можно применить функцию read().
Синтаксис прост и состоит из одного аргумента – количества знаков, которые программе нужно обработать. Причем этот аргумент опциональный, его можно не использовать. В этом случае прочитан будет весь файл, а не отдельная его часть.
>>> f = open(‘example.txt’,’r’)
>>> f.read(7) # чтение 7 символов из example.txt
‘This is ‘
Это код открыл файл, который выше на картинке и прочитал из него только первые два слова, что равняется 7 символам с пробелами.
Хорошо, предположим, нам надо прочитать 7 символов, начиная с восьмого. Что делать в этом случае? Для этого надо повторно использовать эту функцию. То есть, последняя позиция запоминается.
Следовательно, чтобы прочитать файл с 51-й позиции, необходимо один раз прочитать 50 символов, а потом можно применить объект read к этому же объекту с аргументом, равном количеству символов, которые следует прочесть, начиная с 51-й позиции.
readline()
Если файл имеет слишком много символом, то чтение с использованием предыдущей функции несколько неудобное. В этом случае больше подходит функция readline(). Она выполняет построчное чтение файла.
Допустим, у нас есть файл, содержащий следующие строки.
Example of line1.
Example of line2.
Example of line3.
Теперь давайте увидим, как метод readline() используется для нашего файла.
>>> x = open(‘example.txt’,’r’)
>>> x.readline() # строка осуществляет чтение строки №1
Example of line1.
>>> x.readline(2) # строка осуществляет чтение строки №2
Example of line2.
>>> x.readlines() # строка осуществляет чтение строки №3
Что получится в итоге? Вывод интерпретатора будет следующим:
[‘Example of line1.’,’Example of line2.’,’Example of line3.’]
Видим, что в качестве аргумента используется номер строки, которая читается интерпретатором.
write()
Если перед нами стоит задача отредактировать текстовый документ, для этого применяется метод write(). Но для этого требуется открытие файла в режиме записи.
Этот метод можно применять и к несуществующим файлам. В этом случае интерпретатор Python автоматически создаст новый и запишет туда тот текст, который требуется. Следовательно, этот же метод используется для создания новых текстовых файлов.
Синтаксис простой и содержит лишь один аргумент – строку, которую необходимо записать. Также можно использовать регулярные выражения для того, чтобы управлять записью. Например, использовать \n, чтобы следующий текст писать с новой строки. Вот, как это работает.
>>> f = open(‘xyz.txt’,’w’) # открытие в режиме записи
>>> f.write(‘Hello \n World’) # запись Hello World в файл
Hello
World
>>> f.close() # закрытие файла
Изменение имени файла
Чтобы переназвать файл, используется метод rename(). Но сначала надо подгрузить библиотеку os, чтобы получить возможность изменять имена. Метод содержит два аргумента:
- Путь к файлу. Если указать только название (с расширением), то будет переименовываться тот, который находится в той же папке, что и программа. Если же указать полный путь, то можно задать файл, располагающийся в другой директории.
- Новое имя файла.
Работает функция так.
>>> import os
>>> # присвоение файлу нового имени test2.txt
>>> os.rename(«test1″,»test2.txt»)
Управление позицией в текстовых файлах
Управление позицией в файлах возможно такими действиями:
- Определение позиции. Используется метод tell().
- Редактирование. Осуществляется с помощью функции seek().
Для наглядности, как это работает, приведем пример.
>> f = open(‘example.txt’) # файл, созданный нами в самом начале статьи
>>> f.read(4) # выполнение перехода к четвертой позиции
This
>>> f.tell() # получение позиции файла
4
>>> f.seek(0,0) # возврат позиции к изначальной.