Работа с файлами и сохранение данных упрощают использование ваших программ. Пользователь сам выбирает, какие данные и когда нужно вводить. Он может запустить вашу программу, выполнить некоторую работу, потом закрыть программу и позднее продолжить работу с того момента, на котором он прервался. Умение обрабатывать исключения поможет справиться с такими ситуациями, как отсутствие нужных файлов, а также с другими проблемами, приводящими к сбою программ. Обработка исключений повысит устойчивость ваших программ при работе с некорректными данными — появившимися как из-за случайных ошибок, так и из-за злонамеренных попыток взлома ваших программ. Материал, представленный в этой главе, сделает ваши программы более практичными, удобными и надежными.
Чтение из файла
Гигантские объемы данных доступны в текстовых файлах. В них могут храниться погодные данные, социально-экономическая информация, литературные произведения и многое другое. Чтение из файла особенно актуально для приложений, предназначенных для анализа данных, но оно также может пригодиться в любой ситуации, требующей анализа или изменения информации, хранящейся в файле. Например, программа может читать содержимое текстового файла и переписывать его с форматированием, рассчитанным на отображение информации в браузере.
Работа с информацией в текстовом файле начинается с чтения данных в память. Вы можете прочитать все содержимое файла или же читать данные по строкам.
Чтение всего файла
Для начала нам понадобится файл с несколькими строками текста. Пусть это будет файл с числом «пи» с точностью до 30 знаков, по 10 знаков на строку:
pi_digits.txt
3.1415926535
8979323846
2643383279
Чтобы опробовать эти примеры, либо введите данные в редакторе и сохраните файл с именем pi_digits.txt, либо загрузите файл из ресурсов книги на странице https://www.nostarch.com/pythoncrashcourse/. Сохраните файл в каталоге, в котором будут храниться программы этой главы.
Следующая программа открывает этот файл, читает его и выводит содержимое на экран:
file_reader.py
with open('pi_digits.txt') as file_object:
. .contents = file_object.read()
. .print(contents)
В первой строке этой программы многое заслуживает вашего внимания. Начнем с функции open(). Чтобы выполнить любые операции с файлом — даже просто вывести его содержимое, — сначала необходимо открыть файл. Функция open() получает один аргумент: имя открываемого файла. Python ищет файл с указанным именем в каталоге, в котором находится файл текущей программы. В данном примере выполняется программа file_reader.py, поэтому Python ищет файл pi_digits.txt в каталоге, в котором хранится file_reader.py. Функция open() возвращает объект, представляющий файл. В данном случае open('pi_digits.txt') возвращает объект, представляющий файл pi_digits.txt. Python сохраняет этот объект в переменной file_object, с которой мы будем работать позднее в программе.
Конструкция с ключевым словом with закрывает файл после того, как надобность в нем отпадет. Обратите внимание: в этой программе есть вызов open(), но нет вызова close(). Файлы можно открывать и закрывать явными вызовами open() и close(); но если из-за ошибки в программе команда close() останется невыполненной, то файл не будет закрыт. На первый взгляд это не страшно, но некорректное закрытие файлов может привести к потере или порче данных. А если функция close() будет вызвана слишком рано, программа попытается работать с закрытым (то есть недоступным) файлом, что приведет к новым ошибкам. Не всегда можно заранее определить, когда нужно закрывать файл, но с приведенной конструкцией Python сделает это за вас. Вам остается лишь открыть файл и работать с ним так, как требуется, надеясь на то, что Python закроет его автоматически в правильный момент.
После того как в программе появится объект, представляющий файл pi_digits.txt, во второй строке программы используется метод read(), который читает все содержимое файла и сохраняет его содержимое в одной длинной строке в переменной contents. При выводе значения contents на экране появляется все содержимое файла:
3.1415926535
8979323846
2643383279
Единственное различие между выводом и исходным файлом — лишняя пустая строка в конце вывода. Откуда она взялась? Метод read() возвращает ее при чтении, если достигнут конец файла. Если вы хотите удалить лишнюю пустую строку, включите вызов rstrip() в команду print:
with open('pi_digits.txt') as file_object:
contents = file_object.read()
. .print(contents.rstrip())
Напомним, что метод rstrip() удаляет все пропуски в конце строки. Теперь вывод точно соответствует содержимому исходного файла:
3.1415926535
8979323846
2643383279
Пути к файлам
Если передать функции open() простое имя файла, такое как pi_digits.txt, Python ищет файл в том каталоге, в котором находится файл, выполняемый в настоящий момент (то есть файл программы .py).