Чтение данных из внешних файлов осуществляется столь же просто, как запись, но при этом доступно большее количество методов, позволяющих загружать данные в разнообразных режимах. Входные текстовые файлы открываются с флагом режима “r” (от «read» — читать) либо вообще без флага режима (“r” — значение по умолчанию, и параметр часто пропускается). После открытия текстового файла его строки можно читать с помощью метода readlines:
C:\temp> python
>>> file = open(’data.txt’) # открыть входной файл: ‘ г’ — по умолчанию
>>> lines = file.readlines() # прочитать в список строк
>>> for line in lines: # НО! использовать итератор файла!
… print(line, end=’’) # строки оканчиваются символом ‘\n’
Hello file world!
Bye file world.
Метод readlines загружает содержимое файла в память целиком и передает его сценарию в виде списка строк, который можно обойти в цикле. В действительности существует много способов чтения входного файла:
file.read()
Возвращает строку, содержащую все символы (или байты), хранящиеся в файле.
file.read(N)
Возвращает строку, содержащую очередные N символов (или байтов) из файла.
file.readline()
Читает содержимое файла до ближайшего символа \n и возвращает строку.
file.readlines()
Читает файл целиком и возвращает список строк.
Попробуем воспользоваться этими методами для чтения файлов, строк и символов из файлов — вызов метода seek(0) перед каждой попыткой чтения переустанавливает текущую позицию чтения в начало файла (подробнее об этом методе рассказывается чуть ниже):
>>> file.seek(0) # перейти в начало файла
>>> file.read() # прочитать в строку файл целиком
‘Hello file world!\nBye file world.\n’
>>> file.seek(0)
>>> file.readlines() # прочитать файл целиком в список строк
[‘Hello file world!\n’, ‘Bye file world.\n’]
> >> file.seek(0)
> >> file.readline() # читать по одной строке
‘Hello file world!\n’
> >> file.readline()
‘Bye file world.\n’
> >> file.readline() # конец файла — возвращается пустая строка
‘’
> >> file.seek(0) # прочитать N (или оставшиеся) символы/байты
> >> file.read(1), file.read(8) # конец файла — возвращается пустая строка (‘H’, ‘ello fil’)
Все эти методы ввода позволяют определить, сколько данных должно быть получено. Ниже приводится несколько практических правил выбора метода:
• read() и readlines() загружают в память сразу весь файл. Это удобно, когда желательно получить содержимое файла, написав более короткий программный код. Кроме того, эти методы действуют очень быстро, но для больших файлов их применение накладно: загрузка гигабайтных файлов — обычно не самое лучшее решение (а кроме того, на некоторых компьютерах — просто невозможное).
• С другой стороны, вызовы readline() и read(N) возвращают лишь часть файла (очередную строку или блок из N символов или байтов), поэтому они надежнее для потенциально больших файлов, но не так удобны и обычно работают медленнее. Оба метода возвращают пустую строку по достижении конца файла. Если скорость для вас важна, а ваши файлы не слишком велики, методы read и readlines могут оказаться лучшим выбором.
• Кроме того, смотрите обсуждение итераторов файлов в следующем разделе. Как мы увидим, итераторы объединяют в себе удобство метода readlines() и экономное отношение к памяти метода readline(), и на сегодняшний день являются наиболее предпочтительным способом построчного чтения текстовых файлов.
Часто встречающийся здесь вызов seek(0) означает «вернуться в начало файла». В нашем примере этот вызов является альтернативой повторному открытию файла перед очередной попыткой. Все операции чтения и записи в файлах происходят в текущей позиции. Обычно при открытии текущая позиция в файле устанавливается со смещением 0 и перемещается вперед по мере передачи данных. Метод seek просто позволяет переместиться в новую позицию для очередной операции передачи данных. Подробнее об этом методе будет рассказываться ниже, когда мы перейдем к исследованию возможности произвольного доступа к файлам.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011