Искать
Вы превысили запрос на
0 знаков

40. Работа с файлами в Python

Не пройден
0
0

Кратко

- В Python можно работать с файлами при помощи встроенных средств.

- Для открытия файла в Python используется функция open().

- Функция open() принимает два аргумента: путь к файлу и режим открытия.

- Возможные режимы открытия файла: r (чтение), w (запись), x (создание нового файла), a (добавление в конец файла), b (бинарный режим), t (текстовый режим), + (чтение и запись).

- По умолчанию файл открывается в режиме чтения текста.

- Для получения абсолютного пути к файлу необходимо подключить модуль os и использовать метод abspath() класса path.

- Для чтения из файла используется метод read(), возвращающий объект строкового типа.

- Для записи в файл используется метод write(), возвращающий количество записанных символов.

- Для открытия файла в нужной кодировке используется параметр encoding функции open().

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

Открытие файла

Для начала создадим файл с любым именем, например, file.txt в папке с проектом и откроем его при помощи Python в режиме чтения. Для открытия файла в Python существует функция open():

Пример (python)
f = open('file.txt', 'r') 

В нашем примере функция open() принимает два аргумента: путь до файла и режим, в котором открывается файл. Можно так же явно указать, что второй аргумент является именно режимом:

Пример (python)
f = open('file.txt', mode='r') 

Пока не будем вдаваться в подробности использования второго примера, вместо первого. Вернемся к этому вопросу в подразделе «Кодировка».

Аргумент r означает, что файл будет открыт только в режиме чтения. Далее представлены возможные режимы:

  • r – открытие файла для чтение (используется по умолчанию);
  • w – открытие файла для записи, при этом все содержимое файла удаляется, а в случае отсутствия файла по указанному пути, он создается;
  • x – создание нового файла для записи (если файл уже существовал, то возникнет исключение;
  • a – открытие файла для записи, при этом содержимое не удаляется, а новая информация добавляется в конец файла;
  • b – открытие файла в бинарном режиме;
  • t – открытие файла в текстовом режиме (используется по умолчанию);
  • + - открытие файла для чтения и записи.

Перечисленные выше режимы открытия файла можно комбинировать. По умолчанию файл открывается в режиме чтения текста, то есть пример открытия файла в режиме чтения можно было написать проще:

Пример (python)
f = open('file.txt') 

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

Пример (python)
f = open('file.txt')  
print(type(f)) # => <class '_io.TextIOWrapper'> 

Объект класса _io.TextIOWrapper имеет атрибуты namemode и closed, возвращающие имя файла, режим, в котором он открыт и закрыт ли он, соответственно.

Пример (python)
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(), который возвращает абсолютный путь до файла указанного в аргументе:

Пример (python)
import os
print(os.path.abspath('file.txt')) # => C:\Users\Userile.txt 

Теперь мы можем открыть файл, используя абсолютный путь (только необходимо заменить слеши \ на /):

Пример (python)
f = open('C:/Users/User/file.txt') 

Или использовать спецификатор r, который указывает на использование строки в «сыром» виде (нечто похожее мы встречали в уроке про форматирование строк):

Пример (python)
f = open(r'C:\Users\Userile.txt') 

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

Пример (python)
f = open('folder/file.txt') 

Если файл находится выше на одну директорию, то необходимо использовать обозначение «../»:

Пример (python)
f = open('../file.txt') 

Если на два директории выше, то:

Пример (python)
f = open('../../file.txt') 

И так далее.

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

Теперь от атрибутов перейдем к методам, а именно, методу чтения файла read(), возвращающего объект строкового типа:

Пример (python)
f = open('file.txt')  
data = f.read()  
print(data) 

Метод read() без параметров возвращает содержимое всего файла. Если в параметре написать целочисленное число, то будет возвращено указанное количество символов:

Пример (python)
f = open('file.txt')
data = f.read(2)
print(data) 

На самом деле, прочитать информацию построчно можно и без метода read(), а только с использованием цикл for.

Пример (python)
f = open('file.txt')

for line in f:
    print(line) 

Обратите внимание на то, что между строками есть пустая. Откуда она берется? В переменную line сохраняется строка целиком, вместе с символом переноса строки `

. Второй перенос добавляется функция print()`. Можем это исправить:

Пример (python)
f = open('file.txt')

for line in f:
    print(line, end='') 

В следующем уроке узнаем об еще более удобном и надежном способе чтения данных из файла.

Итак, вы открыли файл и прочитали необходимые данные. Теперь необходимо его корректно закрыть. Для этого существует метод close().

Пример (python)
f.close() 

Может возникнуть вопрос, почему разработчики языка сделали close() методом, а не функцией, как open(). Предположим, что open() являлся бы методом:

Пример (python)
'file.txt'.open() 

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

Пример (python)
open('file.txt') 

Тогда почему close() является методом, а не функцией, например:

Пример (python)
close(f) # f – объект, который был создан функцией open() 

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

Одним словом:

Пример (python)
f = open('file.txt') # открыли файл
f.close() # закрыли файл 

Запись в файл

Читать из файла научились. Теперь попробуем записать в файл при помощи встроенных средств Python. Инициализируем переменную str строкой «Hello, World», откроем файл и запишем ее в него при помощи метода write():

Пример (python)
str = "Hello, World"  
  
f = open('file.txt')  
f.write(str) 

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

Пример (python)
str = "Hello, World"  
  
f = open('file.txt', 'a')  
f.write(str) 

Запустите пару раз программу и посмотрите содержимое файла file.txt. Кстати, метод write() возвращает количество записанных символов:

Пример (python)
str = "Hello, World"  
  
f = open('file.txt', 'a')  
print(f.write(str)) # => 12 

Теперь напишите текст на кириллице, запустите программу и посмотрите результат в файле file.txt:

Пример (python)
str = "Привет"  
  
f = open('file.txt', 'a')  
f.write(str) 

Какие-то кракозябры? Разберемся в следующем разделе.

Кодировка файла в Python

Вернемся к функции open(), которая открывает файл. Если заглянуть в модуль встроенных функций builtins.py и найти там функцию open(), можно увидеть какие параметры принимает эта функция (с первыми двумя мы уже разобрались):

Пример (python)
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True) 

Чтобы открыть файл в нужной кодировке есть параметр encoding. Теперь откроем наш файл в кодировке UTF-8:

Пример (python)
str = "Привет"  
f = open('file.txt', 'a', 'utf-8')  
f.write(str) 

Снова ошибка. Третьим параметром является buffering, в который мы передали аргумент utf-8. Чтобы это исправить, следует явно указать параметр, в который мы передаем аргумент:

Пример (python)
str = "Привет"  
f = open('file.txt', 'a', encoding='utf-8')  
f.write(str) 

Если мы явно указываем параметр, то их порядок не важен:

Пример (python)
str = "Привет"  
f = open('file.txt', encoding='utf-8', mode='a')  
f.write(str) 

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

Пример (python)
…  
f.write(str)  
f.close() 

Об аргументах и параметрах мы еще будем говорить в разделе «Функции в Python».

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

В следующем уроке познакомимся с более современным и надежным способом открытия файла, при помощи конструкции with/as, которая гарантирует закрытие файла в любом случае.

Тест

Две секундочки...

Похожие уроки Codebra

@codebra_official
Подписывайся на наш Telegram-канал!
Новости, полезный материал,
программирование и ИБ
Обработка исключений (try/except) в PythonЗнакомство с Python
Продолжаем написание классов в PythonЗнакомство с Python
Итоги раздела «Работа с файлами в Python»Знакомство с Python
Написание модулей в PythonЗнакомство с Python
Погружение в PythonЗнакомство с Python
Типы данных в PythonЗнакомство с Python
Первое знакомство с PythonЗнакомство с Python
Поиск хостов с помощью NmapРазведка и сканирование
Еще о возможностях модулей в PythonЗнакомство с Python
Впервые на сайте Codebra?

Извините за это всплывающее окно, меня они тоже раздражают.

Образовательный ресурс codebra.ru полностью посвящен программированию и компьютерной безопасности. Все курсы и уроки находятся на главной странице. Ради интереса можете посмотреть на содержимое курсов по Пентесту Active Directory, Python, HTML и CSS, JavaScript, C++ и другие, размещенные на главной странице.

Если что-то не нашли, то воспользуйтесь поиском по сайту, который находится на главной странице в самом верху.

Удачи в обучении!

Закрыть окно