Работа с сохраненными данными является основным знанием каждого профессионального программиста Python. С самого раннего выпуска как чтение, так и запись данных в файлы являются встроенными функциями Python. По сравнению с другими языками программирования, такими как C или Java, он довольно прост и требует всего несколько строк кода. Более того, для этого не нужно загружать дополнительный модуль.
Основы файлов в Python
Общие методы работы с файлами: open()
для открытия файла, seek()
для
установки текущей позиции файла по заданному смещению и close()
для
закрытия файлового объекта, когда вы закончите его использовать. Метод
open()
возвращает дескриптор файла, представляющий файловый объект,
который будет использоваться для доступа к файлу для чтения, записи или
добавления.
При открытии файла для чтения Python должен точно знать, как файл должен
быть открыт в системе. Доступны два режима доступа - чтение и чтение в
двоичном режиме. Соответствующие используемые флаги - r
и rb
-
должны быть указаны при открытии файла с помощью встроенного метода
open()
Первый режим включает интерпретацию специальных символов, таких
как «CR» (возврат каретки) и «LF» (перевод строки), для обозначения
разрывов строки, тогда как двоичный режим позволяет вам читать данные в
необработанном режиме, где данные хранятся как без дальнейшей
интерпретации.
После того, как вы открыли файл, метод open()
вернет вам объект файла.
У этих файловых объектов есть такие методы, как read()
, readline()
, write()
, tell()
и seek()
. Хотя некоторые файловые объекты (или
файловые объекты) имеют больше методов, чем перечисленные здесь, они
являются наиболее распространенными. Не все файловые объекты должны
реализовывать все файловые методы.
Примеры
В этой статье мы объясним, как читать файлы с помощью Python на примерах. Некоторые примеры включают чтение файла построчно, как фрагмент (определенное количество строк за раз) и чтение файла за один раз. Кроме того, мы покажем вам способ прочитать только определенную строку из файла без поиска по всему файлу.
Чтение файла построчно
Первый пример основан на двух языках программирования C и C ++. Это
довольно просто: откройте файл с помощью метода open()
, прочтите
файл построчно с помощью
readline()
и выведите строку сразу после чтения. При использовании
здесь является в while
цикл , который непрерывно считывает данные из
файла до тех пор , как readline()
метод сохраняет возвращающееся
данные. В случае , если конец
файла (EOF) достигается в
while
цикл останавливается и объектный файл закрывается, освобождая
ресурсы для других программ для использования.
# define the name of the file to read from
filename = "test.txt"
# open the file for reading
filehandle = open(filename, 'r')
while True:
# read a single line
line = filehandle.readline()
if not line:
break
print(line)
# close the pointer to that file
filehandle.close()
Листинг 1
Как вы могли заметить в листинге 1, мы явно открыли и закрыли файл
(строки 5 и 14 соответственно). Хотя интерпретатор Python автоматически
закрывает открытые файлы в конце выполнения программы Python, явное
закрытие файла с помощью close()
является хорошим стилем
программирования, и о нем не следует забывать.
В качестве улучшения в Python 2.3 был представлен удобный протокол
итератора. Это позволяет упростить readline
следующим образом:
# define the name of the file to read from
filename = "test.txt"
for line in open(filename, 'r'):
print(line)
Листинг 2
Здесь используется for
в сочетании с итератором in
Файл открывается
в строке 4 листинга 2 . Текущая строка идентифицируется с помощью in
, читается из файла, и ее содержимое выводится на стандартный stdout
в
строке 5. Python покрывает открытие и закрытие файла за вас, когда он
выпадает из области видимости. Хотя это неэффективно, это позволяет вам
больше не иметь дело с дескрипторами файлов.
К сожалению, приведенный выше код менее явный и полагается на внутреннюю
сборку мусора Python для обработки закрытия файла. Представленная в
Python 2.5 команда with
еще больше инкапсулирует весь процесс, а также
обрабатывает открытие и закрытие файлов только один раз во всем блоке
кода с определенной областью видимости. В листинге 3 показано, как
использовать команду with
.
# define the name of the file to read from
filename = "test.txt"
with open(filename, 'r') as filehandle:
for line in filehandle:
print(line)
Листинг 3
Комбинация with
и команды open()
открывает файл только один раз
(строка 4). В случае успеха выполняется for
, и содержимое строки
выводится на стандартный stdout
(строки 5 и 6).
Кроме того, использование with
имеет побочный эффект. Интерпретатор
Python внутренне создает блок try
- finally
-block для инкапсуляции
чтения из файла. В листинге 4 показано, что по сути происходит внутри
Python with
блоками кода with:
try:
filehandle = open(filename, 'r')
# do something
finally:
filehandle.close()
Листинг 4
Чтение файла в виде фрагментов строк
До сих пор мы обрабатывали файл построчно. Это довольно медленно для
больших файлов и может быть улучшено путем одновременного чтения
нескольких строк. Для этого в игру вступает метод islice()
из модуля
itertools. Кроме
того, он работает как итератор и возвращает фрагмент данных, состоящий
из n
строк. В конце файла результат может быть короче, и, наконец,
вызов вернет пустой список.
from itertools import islice
# define the name of the file to read from
filename = "test.txt"
# define the number of lines to read
number_of_lines = 5
with open(filename, 'r') as input_file:
lines_cache = islice(input_file, number_of_lines)
for current_line in lines_cache:
print (current_line)
Листинг 5
Чтение определенной строки из файла
Используя методы, показанные выше, мы также можем выполнять другие полезные действия, такие как чтение определенной строки из файла. Для этого мы используем счетчик и печатаем соответствующую строку, когда доходим до нее, просматривая файл.
# define the name of the file to read from
filename = "test.txt"
# define the line number
line_number = 3
print ("line %i of %s is: " % (line_number, filename))
with open(filename, 'r') as filehandle:
current_line = 1
for line in filehandle:
if current_line == line_number:
print(line)
break
current_line += 1
Листинг 6
Листинг 6 должен быть простым для понимания, но он немного длиннее,
чем в предыдущих примерах. Его можно сократить с
помощью модуля
linecache. В листинге 7 показано, как упростить код с помощью метода
getline()
Если запрошенный номер строки выпадает из диапазона
допустимых строк в файле, тогда метод getline()
вместо этого
возвращает пустую строку.
# import linecache module
import linecache
# define the name of the file to read from
filename = "test.txt"
# define line_number
line_number = 3
# retrieve specific line
line = linecache.getline(filename, line_number)
print ("line %i of %s:" % (line_number, filename))
print (line)
Листинг 7
Чтение всего файла сразу
И последнее, но не менее важное: мы рассмотрим совершенно другой случай,
чем в предыдущем примере - чтение всего файла за один раз. Имейте в
виду, что в большинстве случаев на вашем компьютере должно быть
достаточно места для чтения всего файла в память. В листинге 8
используется комбинация оператора with
и метода read()
В этом случае
мы будем использовать read()
для загрузки содержимого файла в виде
потока данных.
# define the name of the file to read from
filename = "test.txt"
with open(filename, 'r') as filehandle:
filecontent = filehandle.read()
print (filecontent)
Листинг 8
Python также предлагает метод readlines()
, который похож на метод
readline()
из первого примера. В отличие от read()
, содержимое
файла хранится в списке, где каждая строка содержимого является
элементом. В листинге 9 показано, как получить доступ к этим данным:
# define the name of the file to read from
filename = "test.txt"
with open(filename, 'r') as filehandle:
filecontent = filehandle.readlines()
for line in filecontent:
print (line)
Листинг 9
Хотя readlines()
будет считывать содержимое из файла до тех пор, пока
не достигнет EOF, имейте в виду, что вы также можете ограничить объем
считываемого содержимого, sizehint
параметр sizehint, который
представляет собой количество байтов для чтения.
Заключение
Как обычно, есть несколько способов прочитать содержимое файла. По скорости все они более или менее относятся к одной категории. Что касается того, какое решение лучше всего подходит для вас, зависит от вашего конкретного варианта использования. Мы думаем, что очень полезно увидеть, что возможно, а затем выбрать наиболее подходящее решение.
Хотя Python значительно упрощает процесс чтения файлов, иногда он все же может быть сложным, и в этом случае я бы рекомендовал вам взглянуть на официальную документацию Python для получения дополнительной информации.
Ресурсы
- Как правильно читать файл в Python, https://www.smallsurething.com/how-to-read-a-file-properly-in-python/
- Обработка больших файлов с использованием python, http://www.blopig.com/blog/2016/08/processing-large-files-using-python/
- Модуль Python itertools, https://docs.python.org/3.6/library/itertools.html
- Модуль Python linecache, https://docs.python.org/3.6/library/linecache.html
Благодарности
Автор благодарит Золеку Хатитонгве за поддержку при подготовке статьи.