0 знаков
40. Работа с файлами в Python
Кратко- В Python можно работать с файлами при помощи встроенных средств.
- Для открытия файла в Python используется функция
open()
.- Функция
open()
принимает два аргумента: путь к файлу и режим открытия.- Возможные режимы открытия файла:
r
(чтение),w
(запись),x
(создание нового файла),a
(добавление в конец файла),b
(бинарный режим),t
(текстовый режим),+
(чтение и запись).- По умолчанию файл открывается в режиме чтения текста.
- Для получения абсолютного пути к файлу необходимо подключить модуль
os
и использовать методabspath()
классаpath
.- Для чтения из файла используется метод
read()
, возвращающий объект строкового типа.- Для записи в файл используется метод
write()
, возвращающий количество записанных символов.- Для открытия файла в нужной кодировке используется параметр
encoding
функцииopen()
.
В этом и последующих уроках мы подробно разберем работу с файлами при помощи встроенных средств Python. Научимся правильно открывать, закрывать файлы, а так же читать и записывать в них.
Открытие файла
Для начала создадим файл с любым именем, например, file.txt
в папке с проектом и откроем его при помощи Python в режиме чтения. Для открытия файла в Python существует функция open()
:
f = open('file.txt', 'r')
В нашем примере функция open()
принимает два аргумента: путь до файла и режим, в котором открывается файл. Можно так же явно указать, что второй аргумент является именно режимом:
f = open('file.txt', mode='r')
Пока не будем вдаваться в подробности использования второго примера, вместо первого. Вернемся к этому вопросу в подразделе «Кодировка».
Аргумент r
означает, что файл будет открыт только в режиме чтения. Далее представлены возможные режимы:
r
– открытие файла для чтение (используется по умолчанию);w
– открытие файла для записи, при этом все содержимое файла удаляется, а в случае отсутствия файла по указанному пути, он создается;x
– создание нового файла для записи (если файл уже существовал, то возникнет исключение;a
– открытие файла для записи, при этом содержимое не удаляется, а новая информация добавляется в конец файла;b
– открытие файла в бинарном режиме;t
– открытие файла в текстовом режиме (используется по умолчанию);+
- открытие файла для чтения и записи.
Перечисленные выше режимы открытия файла можно комбинировать. По умолчанию файл открывается в режиме чтения текста, то есть пример открытия файла в режиме чтения можно было написать проще:
f = open('file.txt')
Отлично, мы открыли файл. Теперь необходимо его прочитать и, например, вывести в консоль. Функция open()
возвращает объект класса _io.TextIOWrapper
:
f = open('file.txt')
print(type(f)) # => <class '_io.TextIOWrapper'>
Объект класса _io.TextIOWrapper
имеет атрибуты name
, mode
и closed
, возвращающие имя файла, режим, в котором он открыт и закрыт ли он, соответственно.
f = open('file.txt')
print(f.name) # => file.txt
print(f.mode) # => r
print(f.closed) # => False
f.close() # закрываем файл
print(f.closed) # => True
Пока мы не изучали ООП (но скоро дойдем до этой темы), поэтому определение атрибутов постараюсь объяснить на примере. Предположим, у нас есть автомобиль (это класс). Автомобилей может быть бесконечное множество: грузовые, легковые и так далее, это объекты. Все автомобили имеют атрибуты: марка, масса, цвет и так далее, это атрибуты класса. Так же все автомобили выполняют какие-то функции: ехать вперед, поворачивать и так далее, это методы класса.
Путь до файла в Python
Мы открыли файл, который расположен в той же директории, что и файл с программой. Такое случается далеко не всегда. В этом подразделе разберемся более подробно с путем до файла в Python.
Чтобы получить абсолютный путь до файла, необходимо подключить библиотеку os
. В классе path
есть метод abspath()
, который возвращает абсолютный путь до файла указанного в аргументе:
import os
print(os.path.abspath('file.txt')) # => C:\Users\Userile.txt
Теперь мы можем открыть файл, используя абсолютный путь (только необходимо заменить слеши \
на /
):
f = open('C:/Users/User/file.txt')
Или использовать спецификатор r
, который указывает на использование строки в «сыром» виде (нечто похожее мы встречали в уроке про форматирование строк):
f = open(r'C:\Users\Userile.txt')
С абсолютными путями разобрались, но как открыть файл, если он расположен в папке на уровень выше или ниже. Если на одном уровне с файлом программы расположена папка, например, folder
и необходимый файл находится в ней, то, чтобы открыть файл, следует использовать такой относительный путь:
f = open('folder/file.txt')
Если файл находится выше на одну директорию, то необходимо использовать обозначение «../
»:
f = open('../file.txt')
Если на два директории выше, то:
f = open('../../file.txt')
И так далее.
Чтение из файла
Теперь от атрибутов перейдем к методам, а именно, методу чтения файла read()
, возвращающего объект строкового типа:
f = open('file.txt')
data = f.read()
print(data)
Метод read()
без параметров возвращает содержимое всего файла. Если в параметре написать целочисленное число, то будет возвращено указанное количество символов:
f = open('file.txt')
data = f.read(2)
print(data)
На самом деле, прочитать информацию построчно можно и без метода read()
, а только с использованием цикл for.
f = open('file.txt')
for line in f:
print(line)
Обратите внимание на то, что между строками есть пустая. Откуда она берется? В переменную line
сохраняется строка целиком, вместе с символом переноса строки `
. Второй перенос добавляется функция
print()`. Можем это исправить:
f = open('file.txt')
for line in f:
print(line, end='')
В следующем уроке узнаем об еще более удобном и надежном способе чтения данных из файла.
Итак, вы открыли файл и прочитали необходимые данные. Теперь необходимо его корректно закрыть. Для этого существует метод close()
.
f.close()
Может возникнуть вопрос, почему разработчики языка сделали close()
методом, а не функцией, как open()
. Предположим, что open()
являлся бы методом:
'file.txt'.open()
В таком случае потребовалось бы, чтобы строковый тип содержал методы для открытия файла и других дополнений для строкового типа. Функция open()
создает новый объект для работы с ним, такая реализация намного проще:
open('file.txt')
Тогда почему close()
является методом, а не функцией, например:
close(f) # f – объект, который был создан функцией open()
Такой способ был бы то же неэффективным, так как в функцию пришлось бы передавать целый объект. Так как каждый созданный функцией open()
объект имеет свои атрибуты и поля, намного проще и лучше, чтобы экземпляр имел метод close()
.
Одним словом:
f = open('file.txt') # открыли файл
f.close() # закрыли файл
Запись в файл
Читать из файла научились. Теперь попробуем записать в файл при помощи встроенных средств Python. Инициализируем переменную str
строкой «Hello, World
», откроем файл и запишем ее в него при помощи метода write()
:
str = "Hello, World"
f = open('file.txt')
f.write(str)
Программа не запустилась. Все правильно, мы же открыли файл для чтения (так как не указали параметр mode
). Исправим это и откроем файл в режиме с записью в конец файла:
str = "Hello, World"
f = open('file.txt', 'a')
f.write(str)
Запустите пару раз программу и посмотрите содержимое файла file.txt
. Кстати, метод write()
возвращает количество записанных символов:
str = "Hello, World"
f = open('file.txt', 'a')
print(f.write(str)) # => 12
Теперь напишите текст на кириллице, запустите программу и посмотрите результат в файле file.txt
:
str = "Привет"
f = open('file.txt', 'a')
f.write(str)
Какие-то кракозябры? Разберемся в следующем разделе.
Кодировка файла в Python
Вернемся к функции open()
, которая открывает файл. Если заглянуть в модуль встроенных функций builtins.py
и найти там функцию open()
, можно увидеть какие параметры принимает эта функция (с первыми двумя мы уже разобрались):
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
Чтобы открыть файл в нужной кодировке есть параметр encoding
. Теперь откроем наш файл в кодировке UTF-8:
str = "Привет"
f = open('file.txt', 'a', 'utf-8')
f.write(str)
Снова ошибка. Третьим параметром является buffering
, в который мы передали аргумент utf-8
. Чтобы это исправить, следует явно указать параметр, в который мы передаем аргумент:
str = "Привет"
f = open('file.txt', 'a', encoding='utf-8')
f.write(str)
Если мы явно указываем параметр, то их порядок не важен:
str = "Привет"
f = open('file.txt', encoding='utf-8', mode='a')
f.write(str)
После окончания работы с файлом, необходимо его закрыть с помощью метода close()
:
…
f.write(str)
f.close()
Об аргументах и параметрах мы еще будем говорить в разделе «Функции в Python».
В этом уроке разобрались, как открывать файлы в разных режимах в Python, познакомились с абсолютными и относительными путями, научились читать из файла и записывать в него.
В следующем уроке познакомимся с более современным и надежным способом открытия файла, при помощи конструкции with/as
, которая гарантирует закрытие файла в любом случае.
Тест
Похожие уроки Codebra
Подписывайся на наш Telegram-канал!
Новости, полезный материал,
программирование и ИБ
Подписывайся на наш Telegram-канал!
Новости, полезный материал,
программирование и ИБ