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 Глава 10 • Файлы и исключения
Также можно точно определить местонахождение файла в вашей системе неза-
висимо от того, где хранится выполняемая программа. Такие пути называются
абсолютными и используются в том случае, если относительный путь не работает.
Например, если каталог
text_files
находится не в
python_work
, а в другом каталоге
(скажем, в каталоге с именем
other_files
), то передать
open()
путь
'text_files/
filename.txt'
не получится, потому что Python будет искать указанный каталог
только внутри
python_work
. Чтобы объяснить Python, где следует искать файл, не-
обходимо записать полный путь.
Абсолютные пути обычно длиннее относительных, поэтому их лучше сохранять
в переменных, которые затем передаются
open()
. В Linux и OS X абсолютные пути
выглядят так:
file_path = '/home/ehmatthes/other_files/text_files/имя_файла.txt'
with open(file_path) as file_object:
В Windows они выглядят так:
file_path = 'C:\Users\ehmatthes\other_files\text_files\имя_файла.txt'
with open(file_path) as file_object:
С абсолютными путями вы сможете читать файлы из любого каталога вашей си-
стемы. Пока будет проще хранить файлы в одном каталоге с файлами программ
или в каталогах, вложенных в каталог с файлами программ (таких как
text_files
из
рассмотренного примера).
Достарыңызбен бөлісу: |