Чтение файлов с помощью Python

Работа с сохраненными данными является основным знанием каждого профессионального программиста Python. С самого раннего выпуска как чтение, так и запись данных в файлы являются встроенными функциями Python. По сравнению с другими языками программирования, такими как C или Java, он довольно прост и требует всего несколько строк кода. Более того, для этого не нужно загружать дополнительный модуль. Основы файлов в Python Общие методы работы с файлами: open () для открытия файла, seek (

Работа с сохраненными данными является основным знанием каждого профессионального программиста 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 для получения дополнительной информации.

Ресурсы

Благодарности

Автор благодарит Золеку Хатитонгве за поддержку при подготовке статьи.

comments powered by Disqus