Работа с файлами в Python: полное руководство по open(), readline() и записи данных

Как работать с разными текстовыми данными

Работа с файлами в Python: полное руководство по open(), readline() и записи данных

Самая простая программа, с которой чаще всего начинается обучение любому языку, — вывод на экран надписи Hello, world! Чтобы такая программа работала, достаточно скрипта с кодом. Но в реальных программах в рабочих сервисах и веб-приложениях часто нужна работа с дополнительными файлами.

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

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

Как открыть файл в Python

Открывать файлы в Питоне нужно при помощи ключевого слова open. Эта команда не просто открывает файл, ещё она говорит программе, что именно мы будем с ним делать и с какой кодировкой нужно работать. Например, если в файле символы кириллицы, то кодировка по умолчанию может не подойти и тогда программа выдаст ошибку или нечитаемые символы.

Синтаксис функции open()

Так выглядит функция для открытия файла и начала работы с ним:

file = open(name, mode, encoding)

Теперь по частям разберём, что означает эта запись:

  • file — переменная, которая будет отвечать за работу с файлом. Все команды нужно применять к этой переменной.
  • open — ключевое слово, которое вызывает функцию.
  • name показывает путь к файлу и его имя.
  • mode — режим работы. Файл можно открывать для чтения, записи, работы с бинарными файлами. Указывать его необязательно, по умолчанию файл откроется в режиме чтения.
  • encoding указывает кодировку. Это тоже необязательный параметр, но при работе с текстом из символов нелатинского алфавита лучше на всякий случай указывать кодировку utf-8.

На параметре с name остановимся немного подробнее.

Если файл находится в корневой директории проекта рядом со скриптом, достаточно просто указать его имя:

file = open(‘example.txt’, ‘r’)

Если он лежит в каком-то подкаталоге, а этот каталог находится рядом со скриптом — нужно указать относительный путь к файлу, начиная с этого подкаталога, например:

file = open(“data/’example.txt”, “r”)

Иногда файл может лежать совсем в другой папке. Тогда нужно указать полный, или абсолютный, путь. Примерно так это будет выглядеть на windows-системах:

file = open(“C:\\Users\\igor\\Documents\\text.txt”, “r”)

А так — на MacOS:

file = open(“/Users/igor/Documents/text.txt”, “r”)

Режимы работы с файлами

Вот пример простой программы, которая должна открыть файл для чтения:

# открываем файл в режиме чтения
file = open('example.txt', 'r')

# читаем содержимое файла
content = file.read()

# выводим содержимое на экран
print(content)

# закрываем файл после работы
file.close()

Если сейчас запустить этот код, мы получим ошибку:

FileNotFoundError: [Errno 2] No such file or directory: ‘example.txt’

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

Вот основные режимы для работы с файлами.

‘r’ (от read) говорит программе открыть файл для чтения. Файл уже должен находиться по указанному адресу.

‘w’ (означает write) открывает файл в режиме записи. Даже если указанного файла в папке нет, Python создаст новый. При каждом запуске программы содержимое файла будет перезаписано заново.

‘a’ (сокращённо от append) не перезаписывает файл, а добавляет новые данные в конец существующих. Но если такого файла нет вообще, программа создаст новый.

‘b’ (означает binary) используется для работы с бинарными файлами. Этот режим используется не сам по себе, а вместе с другими. Это может выглядеть как ‘rb’, ‘wb’, ‘ab’. В реальной жизни это может быть нужно для создания копии бинарного файла или просто чтобы узнать его тип.

 ‘+’ объединяет режимы чтения и записи. Если добавить к  ‘+’, например ‘r+’, ‘w+’, ‘a+’, то файл можно читать и записывать данные, не переключая режим.

Конструкция with open() as file

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

Для удобства и надёжности вместо двух команд — open и close — в Python можно использовать такую конструкцию, как with open() as file

Как выглядит в коде:

with open(‘example.txt’, ‘r’) as file

Внутри ключевого слова open ставим все те же параметры, которые используются при обычном использовании. После этого пишем слова as file и вместо file указываем имя переменной, которую обычно ставим в начале, как здесь:

file = open(‘example.txt’, ‘r’)

Объясняем, почему это работает.

With open — контекстный менеджер, который запускает блоки кода под капотом: нам не нужно добавлять их в программу в явном виде, они будут работать сами по себе. Такой контекстный менеджер автоматически умеет закрывать файл, когда мы закончили с ним работать. Получается, что при виде with open Python будет встраивать в код дополнительные инструкции, которые не занимают место в программе.

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

Чтение файлов в Python

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

Метод read()

Можно прочесть файл целиком как одну большую строку.

Это удобно, если текст небольшой и его можно быстро прочесть. Например, у нас есть такой текстовый файл example.txt:

Программа для вывода полного текста из файла на экран будет выглядеть так:

# открываем файл для чтения
with open('example.txt', 'r') as file:
   # читаем весь файл как одну строку
   function = file.read()

# выводим содержимое файла
print(function)

Теперь после запуска мы увидим весь текст из файла:

Двадцать седьмого февраля 1815 года
дозорный Нотр-Дам де-ла-Гард дал знать
о приближении трёхмачтового корабля «Фараон»,
идущего из Смирны, Триеста и Неаполя.

Метод readline()

Этим методом программа будет читать файл построчно: по одной строке за один вызов.

Код будет таким:

# открываем файл для чтения
with open('example.txt', 'r') as file:
   # читаем первую строку
   first_line = file.readline()

# выводим первую строку
print('Первая строка:', first_line)

А результат — таким:

Первая строка: Двадцать седьмого февраля 1815 года

Метод readlines()

Тоже читает все строки, но сохраняет строки в список.

Меняем предыдущий код и устанавливаем новый метод для работы с файлом:

# открываем файл для чтения
with open('example.txt', 'r') as file:
   # читаем все строки в список
   lines = file.readlines()

# выводим список строк
print('Список строк:', lines)

Теперь при запуске получаем список строк, включая символы \n для переноса на новую строку. Нам при открытии файла этих символов не видно, но их видит программа во время чтения и понимает, что на этом месте нужно сделать переход на новую строку:

Список строк: [‘Двадцать седьмого февраля 1815 года\n’, ‘дозорный Нотр-Дам де-ла-Гард дал знать\n’, ‘о приближении трёхмачтового корабля «Фараон», \n’, ‘идущего из Смирны, Триеста и Неаполя.’]

Итерация по файлу через for

Цикл for используется, чтобы перебирать составные элементы, которые ещё называются коллекциями. Списки, кортежи, словари и строки — это всё наборы элементов.

Файл из нескольких строк тоже можно читать через for. Это удобный и безопасный способ читать строки, потому что Python сам выдаёт их по очереди.

В примере ниже мы применяем этот метод, а при выводе дополнительно удаляем символы переноса новой строки методом .strip(), потому что цикл и так выводит каждый элемент с новой строки:

# открываем файл для чтения
with open('example.txt', 'r') as file:
   # проходимся по каждой строке файла
   for line in file:
       # выводим каждую строку без лишнего переноса
       print(line.strip())

Получается исходный текст:

Двадцать седьмого февраля 1815 года
дозорный Нотр-Дам де-ла-Гард дал знать
о приближении трёхмачтового корабля «Фараон»,
идущего из Смирны, Триеста и Неаполя.

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

Теперь научимся записывать данные в файл.

Метод write()

Метод каждый раз перезаписывает всё содержимое файла. Необязательно уже иметь файл в директории: если его нет, write() создаст новый.

# открываем файл для записи
# если файла нет, то будет создан новый
# при каждом запуске содержимое будет перезаписано
with open('output.txt', 'w') as file:
   # записываем строку в файл
   file.write('Был холодный ясный апрельский день, и часы пробили тринадцать.\n')
   # записываем ещё одну строку
   file.write('Уткнув подбородок в грудь, чтобы спастись от злого ветра,\n')
   # записываем ещё одну строку
   file.write('Уинстон Смит торопливо шмыгнул за стеклянную дверь жилого дома «Победа»,\n')
   # записываем ещё одну строку
   file.write('но всё-таки впустил за собой вихрь зернистой пыли.\n')

Чтобы проверить содержимое файла, можно использовать методы чтения. Например:

# открываем файл для чтения
with open('output.txt', 'r') as file:
   # читаем весь файл как одну строку
   content = file.read()

# выводим содержимое файла
print(content)

В консоли терминала видим строки, которые мы записали:

Был холодный ясный апрельский день, и часы пробили тринадцать.
Уткнув подбородок в грудь, чтобы спастись от злого ветра,
Уинстон Смит торопливо шмыгнул за стеклянную дверь жилого дома «Победа»,
но всё-таки впустил за собой вихрь зернистой пыли.

Метод writelines()

В примере выше нам приходится дублировать метод несколько раз на новых строках кода. Есть способ удобнее: создать один список строк, а потом записать их все за раз методом writelines():

# готовим список строк для записи
lines = ['Был холодный ясный апрельский день, и часы пробили тринадцать.\n',
        'Уткнув подбородок в грудь, чтобы спастись от злого ветра,\n',
        'Уинстон Смит торопливо шмыгнул за стеклянную дверь жилого дома «Победа»,\n',
        'но всё-таки впустил за собой вихрь зернистой пыли.\n']

# открываем файл для записи
with open('output.txt', 'w') as file:
   # записываем все строки за один вызов
   file.writelines(lines)

Если прочесть то, что получилось, увидим тот же результат, как при использовании предыдущего метода write().

Добавление данных в файл без перезаписи

Запись в режиме ‘w’ при каждом вызове перезаписывают предыдущее содержимое. Если нужно сохранить предыдущие записи, нужен другой режим — ‘a’. Например, чтобы записать логи за всё время, а не только за последний сеанс работы.

При этом методы будут использоваться те же:

# открываем файл в режиме добавления
with open('output.txt', 'a') as file:
   # добавляем новую строку в конец файла
   file.write('\nВ вестибюле пахло варёной капустой и старыми половиками.\n')

При чтении файла видно, что предыдущее содержимое сохранилось:

Был холодный ясный апрельский день, и часы пробили тринадцать.
Уткнув подбородок в грудь, чтобы спастись от злого ветра,
Уинстон Смит торопливо шмыгнул за стеклянную дверь жилого дома «Победа»,
но всё-таки впустил за собой вихрь зернистой пыли.
В вестибюле пахло варёной капустой и старыми половиками.

Создание и управление файлами

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

Как создать новый файл

Чтобы создать файл, достаточно открыть его в режиме ‘w’ или ‘a’. Если файл не существует — Питон создаст новый. 

Такая строка кода создаст новый файл:

# открываем файл в режиме добавления
with open('new_file.txt', 'a') as method:

Проверка существования файла

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

В Python для такой проверки можно использовать модуль os. В примере ниже программа запускает метод .exists из этого модуля, который возвращает True или False, и выводит результат этой проверки:

# импортируем модуль os для работы с файлами
import os

# проверяем, существует ли файл
if os.path.exists('settings.txt'):
# выводим сообщения о результате проверки
   print('Файл найден!')
else:
   print('Файл не существует.')

Как это работает: если в корневой директории проекта лежит файл с указанным именем, os.path.exists вернёт значение True. Тогда программа выведет сообщение о том, что файл найден. Если файла с таким именем нет, вернётся значение False и сообщение из блока else, что на момент проверки его не существует.

Удаление и переименование файлов

Для этих операций можно использовать модуль os и методы os.remove() и os.rename()

Как выглядит пример применения:

# импортируем модуль os
import os

# переименовываем файл
os.rename('oldname.txt', 'newname.txt')

# удаляем файл
os.remove('trash.txt')

Работает так.

В этой строке:

os.rename(‘oldname.txt’, ‘newname.txt’)

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

Для удаления передаём имя файла, который нужно удалить. У нас это trash.txt:

os.remove(‘trash.txt’)

Практические примеры работы с файлами

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

Обработка текстовых файлов

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

Например, читать один большой файл с вопросами для экзаменов и распределять в графическом интерфейсе текст вопроса, варианты ответов в случайном порядке и реагировать на ответы пользователя:

Работа с CSV и JSON

Форматы CSV и JSON часто используются для хранения таблиц и структурированных данных. Файлы CSV похожи на таблицы в Excel, а JSON — на словари из пар «ключ — значение». Внутри JSON удобно сохранять настройки, данные пользователей или ответы API.

Такой код считывает файл .json и запрашивает значение, которое находится в паре с ключом username:

# импортируем модуль json
import json

# открываем JSON-файл
with open('settings.json', 'r', encoding='utf-8') as file:
   # загружаем данные как словарь
   data = json.load(file)

# выводим значение по ключу
print(data['username'])

Если в файле есть такой ключ, то в терминале мы увидим его значение. У нас в файле прописано такое, поэтому программа выведет:

the_code_media

Логирование в файл

Логирование — это как журнал происходящего. Полезно, чтобы фиксировать ошибки, успешные действия, работу сервера.

Вместе с логированием чаще всего используется модуль для получения времени, чтобы разработчики сервиса знали, когда произошло записанное в логах событие. Вместо обычного текстового файла используется специальный формат для логирования .log:

Вот простой пример такой программы:

# импортируем модуль datetime для времени
from datetime import datetime

# получаем текущее время
now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

# открываем файл для добавления
with open('app.log', 'a', encoding='utf-8') as file:
    # записываем лог-сообщение с меткой времени
    file.write(f'[{now}] Программа запущена\n')

Теперь в корневой директории проекта появился файл app.log, в котором находится одна запись с временной меткой:

[2025-07-21 13:47:28] Программа запущена

С какими ещё файлами можно работать

Мы в статье разобрали работу с текстовыми файлами, но в программах используются и другие типы — например, в виртуальном хранилище данных, онлайн-редакторе PDF, проигрывателе музыки или видео. В следующих статьях напишем пример такой простой программы и покажем, как работать с такими форматами.

Бонус для читателей

Скидка 20% на все курсы Практикума до 30 ноября! «Чёрная пятница» и такие скидки бывают раз в год.

Вам слово

Приходите к нам в соцсети поделиться своим мнением о статье и почитать, что пишут другие. А ещё там выходит дополнительный контент, которого нет на сайте — шпаргалки, опросы и разная дурка. В общем, вот тележка, вот ВК — велком!

Вам может быть интересно
easy
[anycomment]
Exit mobile version