Читання файлів за допомогою 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() і виведіть рядок одразу після читання.

Тут використовується a 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 loop:


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

Тут використовується a 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 створює a try-finally-блок для інкапсуляції читання з файлу. Наступний приклад показує, що насправді відбувається всередині 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 Додаткова інформація.

Часова мітка:

Більше від Stackabuse