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

Введение

Для работы с сохраненными данными обработка файлов становится основным знанием каждого профессионального программиста Python. С самого раннего выпуска Python как чтение, так и запись данных в файлы являются встроенными функциями. По сравнению с другими языками программирования, такими как C или Java, он довольно прост и требует всего несколько строк кода. Кроме того, для правильной работы не требуется загружать дополнительный модуль.

В этой статье мы объясним, как читать файлы с помощью Python на примерах. Некоторые примеры включают чтение файла построчно, как фрагмент (определенное количество строк за раз) и чтение файла за один раз. Кроме того, мы покажем вам способ чтения только определенной строки из файла без поиска по всему файлу.

Основы работы с файлами в Python

Общие методы работы с файлами: open() чтобы открыть файл, seek() установить текущую позицию файла с заданным смещением и close() чтобы закрыть файловый объект, когда вы закончите его использовать. встроенный open() Функция возвращает дескриптор файла, представляющий файловый объект, который будет использоваться для доступа к файлу для чтения, записи или добавления.

При открытии файла для чтения Python должен точно знать, как файл следует открывать в системе. Доступны два режима доступа – чтение и чтение в бинарном режиме. Соответствующие флаги используются 'r'и 'rb', и должны быть указаны при открытии файла встроенным open() функция. Первый режим включает интерпретацию специальных символов, таких как «CR» (возврат каретки) и «LF» (перевод строки), для представления разрывов строк, тогда как двоичный режим позволяет вам читать данные в необработанном режиме, где данные хранятся как есть. без дальнейшего толкования.

После того, как вы открыли файл, open() функция вернет вам файловый объект. Эти файловые объекты имеют такие методы, как read(), readline(), write(), tell()и seek(). Хотя некоторые файловые объекты (или файловоподобные объекты) имеют больше методов, чем перечислено здесь, они являются наиболее распространенными. Не все файловые объекты должны реализовывать все файловые методы.

Чтение файла построчно

Первый пример вдохновлен двумя языками программирования — C и C++. Это, пожалуй, самый интуитивный подход — открыть файл с помощью open() Функция, читать файл построчно используя readline() метод и вывести строку сразу после чтения.

Здесь используется while цикл, который непрерывно читает из файла до тех пор, пока readline() метод продолжает возвращать данные. В случае достижения конца файла (EOF) while цикл останавливается, и файловый объект закрывается, освобождая ресурсы для использования другими программами:


filename = "test.txt"

filehandle = open(filename, 'r')
while True:
    
    line = filehandle.readline()
    if not line:
        break
    print(line)


filehandle.close()

Как вы могли заметить, в этом примере мы явно открыли и закрыли файл. Хотя интерпретатор Python автоматически закрывает открытые файлы в конце выполнения программы Python, явно закрывая файл через close() хороший стиль программирования, и его не следует забывать.

В качестве улучшения, удобный протокол итератора был представлен в Python 2.3. Это позволяет упростить readline цикл:


filename = "test.txt"
for line in open(filename, 'r'):
    print(line)

Здесь используется for петля в сочетании с in итератор. Текущая строка определяется с помощью in итератор, читается из файла, а его содержимое выводится в stdout. Python обеспечивает открытие и закрытие файла для вас, когда он выходит за рамки. Хотя это неэффективно, это позволяет вам больше не иметь дело с файловыми дескрипторами.

К сожалению, приведенный выше код менее явный и полагается на внутреннюю сборку мусора Python для обработки закрытия файла.

Представленный в Python 2.5, with Команда еще больше инкапсулирует весь процесс, а также обрабатывает открытие и закрытие файлов только один раз во всем блоке кода с областью видимости:


filename = "test.txt"
with open(filename, 'r') as filehandle:
    for line in filehandle:
        print(line)

Сочетание with заявление и open() Команда открывает файл только один раз. В случае успеха for выполняется цикл, и содержимое строки печатается на stdout.

Кроме того, использование with заявление имеет побочный эффект. Внутри интерпретатор Python создает tryfinally-block для инкапсуляции чтения из файла. В следующем примере показано, что по существу происходит внутри Python с помощью with блоки кода:

try:
    filehandle = open(filename, 'r')
    
finally:
    filehandle.close()

Чтение файла как кусков строк

До сих пор мы обрабатывали файл построчно. Это довольно медленно для больших файлов, и его можно улучшить, прочитав несколько строк одновременно. Чтобы добиться этого, islice() метод из itertools модуль вступает в игру. Кроме того, он работает как итератор и возвращает блок данных, состоящий из n линии. В конце файла результат может быть короче, и, наконец, вызов вернет пустой список:

from itertools import islice

filename = "test.txt"

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)

Чтение определенной строки из файла

Используя методы, показанные выше, мы также можем выполнять другие полезные действия, такие как чтение определенной строки из файла. Для этого мы используем счетчик и печатаем соответствующую строку, когда доходим до него во время итерации по файлу:


filename = "test.txt"

line_number = 3
print (f"line {line_number} of {filename} is: ")

with open(filename, 'r') as filehandle:
current_line = 1
    for line in filehandle:
        if current_line == line_number:
            print(line)
            break
        current_line += 1

Это должно быть просто для понимания, но немного длиннее предыдущих примеров. Его можно сократить с помощью линейный кэш модуль.

В следующем примере показано, как упростить код с помощью getline() метод. Если запрошенный номер строки выходит за пределы допустимого диапазона строк в файле, то getline() Вместо этого метод возвращает пустую строку:


import linecache

filename = "test.txt"

line_number = 3

line = linecache.getline(filename, line_number)
print (f"line {line_number} of {filename}:")
print (line)

Чтение всего файла сразу

Наконец, что не менее важно, мы рассмотрим случай, который сильно отличается от предыдущего примера — чтение всего файла за один раз.

Имейте в виду, что в большинстве случаев у вас должно быть достаточно памяти для чтения всего файла, так как символы не занимают слишком много места, но утомляют большие файлы. В следующем примере используется комбинация with заявление, и read() метод. В этом случае мы будем использовать read() для загрузки содержимого файла в виде потока данных:

Ознакомьтесь с нашим практическим руководством по изучению Git с рекомендациями, принятыми в отрасли стандартами и прилагаемой памяткой. Перестаньте гуглить команды Git и на самом деле изучить это!


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.read()
    print (filecontent)

Python также предлагает readlines() метод, аналогичный методу readline() метод из первого примера. В отличие от read(), содержимое файла хранится в списке, где каждая строка содержимого является элементом:


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.readlines()
    for line in filecontent:
        print (line)

В то время как readlines() будет считывать содержимое из файла до тех пор, пока не достигнет EOF, имейте в виду, что вы также можете ограничить объем читаемого содержимого, предоставив sizehint параметр, который представляет собой количество байтов для чтения.

Заключение

Как обычно, есть несколько способов прочитать содержимое файла. С точки зрения скорости все они более или менее в одной категории. Какое решение лучше всего подходит для вас, зависит от вашего конкретного случая использования. Мы думаем, что очень полезно увидеть, что возможно, а затем выбрать наиболее подходящее решение.

Несмотря на то, что Python значительно упрощает процесс чтения файлов, иногда он все же может стать сложным, и в этом случае я рекомендую вам взглянуть на официальная документация Python для дополнительной информации.

Отметка времени:

Больше от Стекабьюс