ПРИМЕЧАНИЕ
Иногда в системах семейства Windows слеш в пути к файлам интерпретируется правильно . Если вы
используете Windows, но не получаете ожидаемых результатов, попробуйте использовать символы
обратного слеша .
Чтение по строкам
В процессе чтения файла часто бывает нужно обработать каждую строку. Воз-
можно, вы ищете некую информацию в файле или собираетесь каким-то образом
изменить текст, например при чтении файла с метеорологическими данными вы
обрабатываете каждую строку, у которой в описании погоды встречается слово
«солнечно». Или, допустим, в новостях вы ищете каждую строку с тегом заголовка
и заменяете ее специальными элементами форматирования.
Для последовательной обработки каждой строки в файле можно воспользоваться
циклом
for
:
file_reader.py
filename = 'pi_digits.txt'
with open(filename) as file_object:
for line in file_object:
print(line)
В точке имя файла, из которого читается информация, сохраняется в перемен-
ной
filename
. Это стандартный прием при работе с файлами: так как переменная
Чтение из файла 189
filename
не представляет конкретный файл (это всего лишь строка, которая со-
общает Python, где найти файл), вы сможете легко заменить
'pi_digits.txt'
именем другого файла, с которым вы собираетесь работать. После вызова
open()
объект, представляющий файл и его содержимое, сохраняется в переменной
file_object
. Мы снова используем синтаксис
with
, чтобы поручить Python
открывать и закрывать файл в нужный момент. Для просмотра содержимого все
строки файла перебираются в цикле
for
по объекту файла .
На этот раз пустых строк оказывается еще больше:
3.1415926535
8979323846
2643383279
Пустые строки появляются из-за того, что каждая строка в текстовом файле за-
вершается невидимым символом новой строки. Команда
print
добавляет свой
символ новой строки при каждом вызове, поэтому в результате каждая строка
завершается двумя символами новой строки: один прочитан из файла, а другой
добавлен командой
print
. Вызов
rstrip()
в команде
print
удаляет лишние пу-
стые строки:
filename = 'pi_digits.txt'
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
Теперь вывод снова соответствует содержимому файла:
3.1415926535
8979323846
2643383279
Создание списка строк по содержимому файла
При использовании
with
объект файла, возвращаемый вызовом
open()
, доступен
только в пределах содержащего его блока
with
. Если вы хотите, чтобы содержимое
файла оставалось доступным за пределами блока
with
, сохраните строки файла
в списке внутри блока и в дальнейшем работайте с полученным списком. Одни
части файла можно обработать немедленно и отложить другие для обработки
в будущем.
В следующем примере строки
pi_digits .txt
сохраняются в списке в блоке
with
, после
чего выводятся за пределами этого блока:
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
190 Глава 10 • Файлы и исключения
for line in lines:
print(line.rstrip())
В точке метод
readlines()
последовательно читает каждую строку из файла
и сохраняет ее в списке. Список сохраняется в переменной
lines
, с которой можно
продолжить работу после завершения блока
with
. В точке в простом цикле
for
выводятся все элементы списка
lines
. Так как каждый элемент
lines
соответствует
ровно одной строке файла, вывод точно соответствует его содержимому.
Работа с содержимым файла
После того как файл будет прочитан в память, вы сможете обрабатывать данные
так, как считаете нужным. Для начала попробуем построить одну строку со всеми
цифрами из файла без промежуточных пропусков:
pi_string.py
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.rstrip()
print(pi_string)
print(len(pi_string))
Сначала программа открывает файл и сохраняет каждую строку цифр в списке —
точно так же, как это делалось в предыдущем примере. В точке создается пере-
менная
pi_string
для хранения цифр числа «пи». Далее следует цикл, который
добавляет к
pi_string
каждую серию цифр, из которой удаляется символ новой
строки . В точке программа выводит строку и ее длину:
3.1415926535 8979323846 2643383279
36
Переменная
pi_string
содержит пропуски, которые присутствовали в начале
каждой строки цифр. Чтобы удалить их, достаточно использовать
strip()
вместо
rstrip()
:
filename = 'pi_30_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.strip()
print(pi_string)
print(len(pi_string))
Чтение из файла 191
В итоге мы получаем строку, содержащую значение «пи» с точностью до 30 знаков.
Длина строки равна 32 символам, потому что в нее также включается начальная
цифра 3 и точка:
3.141592653589793238462643383279
32
Достарыңызбен бөлісу: |