Работа с файлами
Чтение всего файла
Для начала нам понадобится файл с несколькими строками текста. Пусть это будет текстовый файл с текстом-заполнителем "lorem ipsum".
Следующая программа открывает этот файл, читает его и выводит содержимое на экран
Начнем с функции open(). Чтобы выполнить любые операции с файлом - даже просто вывести его содержимое, - сначала необходимо открыть файл. Функция open() получает один аргумент: имя открываемого файла. Python ищет файл с указанным именем в каталоге, в котором находится файл текущей программы. В данном примере выполняется программа main.py, поэтому Python ищет файл file.txt в каталоге, в котором храниться main.py.
Функция open() возвращает объект, представляющий файл. В данном случае open('file.txt') возвращает объект, представляющий файл file.txt. Python сохраняет этот объект в переменной file_object, с которым мы будем работать позднее в программе.
Конструкция с ключевым словом with закрывает файл после того, как надобность в нем отпадает. Обратите внимание: в этой программе есть вызов open(), но нет вызова close(). Файлы можно открывать и закрывать явными вызовами open() и close(); но если из-за ошибки в программе команда close() останется невыполненной, то файл не будет закрыт. На первый взгляд это не страшно, но некорректное закрытие файлов может привести к потере или порче данных. А если функция close() будет вызвана слишком рано, программа попытается работать с закрытым (то есть недоступным) файлом, что приведет к новым ошибкам. Не всегда можно заранее определить, когда нужно закрывать файл, но с приведенной конструкцией Python сделает это за вас. Вам остается лишь открыть файл и работать с ним так, как требуется, надеясь на то, что Python закроет его автоматически при завершении блока with.
После того, как в программе появится объект, представляющий файл file.txt, во второй строке программы используется функция read(), которая читает всё содержимое файла и сохраняет его в одной длинной строке в переменной contents. При выводе значения contents на экране появляется всё содержимое файла
Единственное различие между выводом и исходным файлом - лишняя пустая строка в конце вывода. Откуда она взялась? Функция read() возвращает ее при чтении, если достигнут конец файла. Если вы хотите удалить лишнюю пустую строку, включите вызов функции rstrip() в вызове функции print()
Функция rstrip() удаляет все пропуски в конце строки.
Пути к файлам
Если передать функции open() простое имя файла, такое как file.txt, Python ищет файл в том каталоге, в котором находится файл, выполняемый в настоящий момент (то есть файл программы .py).
В некоторых случаях открываемый файл может находиться в разных каталогах с файлом программы. Чтобы открыть файл из каталога, отличного от того, в котором хранится файл программы, необходимо указать путь (path) - то есть указать Python искать файлы в конкретном месте файловой системы.
Создадим в папке с программой каталог text_files
и поместим туда файл file.txt
. В этом случае можно воспользоваться относительным путем (relative path). Относительный путь указывает Python искать файлы в каталоге, который задается относительно каталога, в котором находится текущий файл программы. В нашем примере это может выглядеть так
Запись в строке 1 означает, что файл file.txt следует искать в каталоге text_files, который находится в том же каталоге, что и файл программы.
Также можно точно определить местонахождение файла в вашей системе независимо от того, где хранится выполняемая программа. Такие пути называются абсолютными (absolute path) и используются в том случае, если относительный путь неэффективен или его неудобно прописывать (такое часто бывает, когда файл находится в совершенно других папках, не связанных с программой или проектом).
Абсолютные пути обычно длиннее относительных, поэтому их лучше сохранять в переменных, которые затем передаются функции open()
С абсолютными путями вы сможете читать файлы из любого каталога вашей системы, но абсолютные пути практически исключают возможность использовать программы с файлами на других устройствах (необходимо будет полностью продублировать абсолютный путь на запускаемом устройстве).
Чтение по строкам
В процессе чтения файла часто бывает нужно обработать каждую строку. Возможно, вы ищете некую информацию в файле или собираетесь каким-то образом изменить текст - например, при чтении файла с метеоданными вы обрабатываете каждую строку, в которой в описании погоды встречается слово "солнечно". Или, допустим, в новостях вы ищете каждую строку с тегом заголовка и заменяете ее специальными элементами форматирования.
Для последовательной обработки каждой строки в файле можно воспользоваться циклом for
Обратите внимание, что в этом случае появится много пустых строк. Они появляются из-за того, что каждая строка в текстовом файле завершается невидимым символом новой строки. Функция print() добавляет свой символ новой строки при каждом вызове, поэтому в результате каждая строка завершается двумя символами новой строки: один прочитан из файла, а другой добавлен функцией print(). Вызов rstrip() удаляет лишние пустые строки
Создание списка строк по содержимому файла
При использовании with объект файла, возвращаемый вызовом open(), доступен только в пределах содержащего его блока with. Если вы хотите, чтобы содержимое файла оставалось доступным за пределами блока with, сохраните строки файла в списке внутри блока и в дальнейшем работайте с полученным списком. Одни части файла можно обработать немедленно, а другие отложить для обработки в будущем.
Функция readlines() последовательно читает каждую строку из файла и сохраняет ее в списке. Список сохраняется в переменной lines, с которой можно продолжить работу после завершения блока with.
Запись в файл
Чтобы записать текст в файл, необходимо вызвать функцию open() со вторым аргументом, который сообщает Python что вы собираетесь записывать данные в файл. Чтобы увидеть, как это делается, напишем просто сообщение и сохраним его в файле
Last updated