Глава 10 • Файлы и исключения
Чтение всего файла
Для начала нам понадобится файл с несколькими строками текста. Пусть это будет
файл с числом «пи» с точностью до 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()
, который читает все содер-
жимое файла и сохраняет его содержимое в одной длинной строке в переменной
Чтение из файла
187
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
).
В некоторых случаях (в зависимости от того, как организованы ваши рабочие фай-
лы) открываемый файл может и не находиться в одном каталоге с файлом програм-
мы. Например, файл программы может находиться в каталоге
python_work
; в ката-
логе
python_work
создается другой каталог с именем
text_files
для текстовых файлов,
с которыми работает программа. И хотя папка
text_files
находится в
python_work
,
простая передача
open()
имени файла из
text_files
не подойдет, потому что Python
проведет поиск файла в
python_work
и на этом остановится; поиск не будет продол-
жен во вложенном каталоге
text_files
. Чтобы открыть файлы из каталога, отличного
от того, в котором хранится файл программы, необходимо указать
путь
— то есть
приказать Python искать файлы в конкретном месте файловой системы.
Так как каталог
text_files
находится в
python_work
, для открытия файла из
text_files
можно воспользоваться
относительным
путем. Относительный путь приказы-
вает Python искать файлы в каталоге, который задается
относительно
каталога,
в котором находится текущий файл программы. В системе Linux и OS X это вы-
глядит так:
with open('text_files/
имя_файла
.txt') as file_object:
Эта строка означает, что файл
.txt
следует искать в каталоге
text_files
; она предпо-
лагает, что каталог
text_files
находится в
python_work
(так оно и есть). В системах
Windows в путях к файлам вместо слеша (
/
) используется обратный слеш (
\
):
with open('text_files\
имя_файла
.txt') as file_object:
188
Достарыңызбен бөлісу: |