Основы работы с файлами Python | Журнал "Вольт"
Пн. Окт 26th, 2020


Михаил Свинцов

Михаил Свинцов, автор курса «Full-stack веб-разработчик на Python»

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

Встроенные инструменты Python

Основа для работы с файлами – встроенная функция open()

open(file, mode="rt")

У этой функции два аргумента. Аргумент file принимает строку, содержащую путь к файлу. Второй аргумент, mode, позволяет указать режим, в котором вы хотите работать с файлом. По умолчанию этот аргумент принимает значение rt “, который и некоторые другие можно найти в таблице ниже.

Эти режимы можно комбинировать. Например, «rb открывает двоичный файл для чтения. Комбинируя «r +» или «w +», вы можете добиться открытия файла в режиме и одновременного чтения и записи с одним отличием – первый режим вызовет исключение, если файл не существует, а работа во втором режиме приведет к создайте его в этом случае.

Начать работу с файлом можно с помощью объекта класса io.TextIOWrapperкоторый возвращается функцией open()… Этот объект имеет несколько атрибутов, с помощью которых можно получить информацию.

  • name – имя файла;
  • mode – режим, в котором открыт этот файл;
  • closed – возвращает Trueесли файл был закрыт.

По окончании работы с файлом его необходимо закрыть методом close()

f = open("examp.le", "w")
//  работа с файлом
f.close()

Однако более питонический способ работы с встроенным файлом – использовать конструкцию with .. as ..который действует как менеджер создания контекста. Приведенный выше пример можно переписать с его помощью

with open("examp.le", "w") as f:
// работа с файлом

Основное отличие в том, что python закрывает сам файл, и разработчику не нужно об этом помнить. И в качестве бонуса, при открытии файла исключений не будет (например, если файл не существует).

Чтение из файла

При открытии файла в читаемом режиме можно использовать несколько подходов.

Для начала вы можете прочитать весь файл и записать все данные в нем в одной строке.

with open("examp.le", "r") as f:
    text = f.read()

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

with open("examp.le", "r") as f:
    part = f.read(16)

При этом будут получены только первые 16 символов текста. Важно понимать, что при применении этой функции несколько раз подряд этот текст будет прочитан по частям – виртуальный курсор будет перемещаться по прочитанной части текста. При необходимости его можно переместить в определенное место с помощью метода seek()

with open("examp.le", "r") as f: # 'Hello, world!'
    first_part = f.read(8)       # 'Hello, w'
    f.seek(4)
    second_part = f.read(8)      # 'o, world'

Другой способ – прочитать файл построчно. Метод readline() читает строку и, как и в случае с методом read(), перемещает курсор – теперь только на всю строку. Применение этого метода несколько раз приведет к чтению нескольких строк. Подобно этому методу, другой метод позволяет вам читать весь файл, но построчно, записывая их в список. Этот список можно использовать, например, как итерацию в цикле.

with open("examp.le", "r") as f:
    for line in f.readlines():
        print(line)

Однако здесь есть и более питонический способ. Он заключается в том, что сам объект io.TextIOWrapper имеет итератор, который возвращает строку за строкой. Благодаря этому нет необходимости читать весь файл, сохраняя его в списке, но вы можете динамически читать файл построчно. И сделайте это лаконично.

with open("examp.le", "r") as f:
    for line in f:
        print(line)

Записать в файл

Функциональность ввода данных в файл не зависит от режима – добавление данных или перезапись файла. Также существует несколько подходов к выполнению этой операции.

Самый простой и логичный – использовать функцию write()

with open("examp.le", "w") as f:
    f.write(some_string_data)

Важно, чтобы в качестве аргумента функции можно было передавать только строки. Если необходимо записать информацию другого типа, то ее необходимо явно привести к строковому типу с помощью методов __str__(self) для объектов или форматированных строк.

В файл можно записать большой объем данных, если он может быть представлен в виде списка строк.

with open("examp.le", "w") as f:
    f.writelines(list_of_strings)

Здесь есть еще один нюанс, связанный с тем, что функции write() а также writelines() не ставьте автоматически разрыв строки, и разработчик должен контролировать это самостоятельно.

Есть еще один, менее известный способ, но, пожалуй, самый удобный из представленных. И, как ни странно, заключается в использовании функции print()… Поначалу это утверждение может показаться странным, ведь общеизвестно, что он используется для вывода в консоль. И это правда. Но если вы передадите необязательный аргумент file объект типа io.TextIOWrapper, который является файловым объектом, с которым мы работаем, затем выходной поток функции print() перенаправляет с консоли в файл.

with open("examp.le", "w") as f:
    print(some_data, file=f)

Сила этого подхода в том, что в print() вы можете передавать необязательные строковые аргументы – при необходимости функция сама преобразует их в строковый тип.

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



Source link

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *