Скидки до 60% и розыгрыш MacBook 0 дней 00 :00 :00 Выбрать курс
Код
#статьи

Как работать с файлами в Python

Экспресс-гайд по работе с методами open(), read() и write().

Иллюстрация: Оля Ежак для Skillbox Media

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

Содержание


С какими файлами можно работать в Python

В Python файлы разделяют на две категории:

  • Текстовые — файлы с текстом, который понятен человеку. К ним относятся документы с расширениями .txt, .csv, .log, .ini, .json, .xml и другими.
  • Бинарные — файлы, данные в которых представлены в виде последовательности байтов. К ним относятся документы с расширениями .jpg, .png, .gif, .docx, .mp4, .exe, .dat и другими. Для работы с такими файлами обычно нужны специальные редакторы. Например, Photoshop для изображений и Final Cut Pro для видео.

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

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

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

open(имя_файла, режим, тип_кодировки)

В ней:

  • имя_файла — относительный (data/input.txt) или абсолютный (C:\Users\User\Documents\my_file.txt) путь к файлу.
  • режим — строка, определяющая, как именно вы хотите открыть файл. Например, можно сделать его доступным только для чтения, чтобы случайно не удалить данные.
  • тип_кодировки — параметр, который указывает кодировку для текстовых файлов. По умолчанию Python использует системное значение: CP1251 в Windows и UTF-8 в Linux. Если работаете с кириллицей, лучше явно указать UTF-8, чтобы не было проблем с отображением символов на разных платформах.

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

Перечислим основные режимы работы с файлами в Python, которые можно указать в качестве аргумента функции open():

  • 'r' — открывает файл для чтения. При этом файл должен существовать, иначе возникает ошибка FileNotFoundError.
file_read = open('my_file.txt', 'r')
  • 'w' — открывает файл для записи. Если он существует, то Python очистит содержимое, если нет — создаст новый.
file_write = open('output.txt', 'w')
  • 'a' — записывает данные в конец существующего файла. Если его нет, то Python создаст новый с указанным именем.
file_app = open('log.txt', 'a')
  • 'x' — создаёт файл с указанным в параметре функции именем.
file_excl = open('log.txt', 'x')
  • 'b' — даёт возможность работать с бинарными файлами, например с изображениями. Следует указывать вместе с одним из вышеперечисленных режимов открытия: 'rb', 'wb', 'ab' или 'xb'.
file_binary = open('image.jpg', 'rb')
  • '+' — универсальный режим для одновременного чтения и записи. Следует указывать вместе с одним из вышеперечисленных режимов открытия: 'r+', 'w+', 'a+' или 'x+'.
file_rw = open('data.txt', 'r+')

Чтение и запись файлов

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

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

Получить данные из файла можно с помощью функций:

read() — считывает всё содержимое файла и помещает его в одну строку. Метод подходит для работы с небольшими документами. Если вы точно знаете, сколько символов надо получить из файла, то можете указать количество в виде аргумента. Например, функция file.read(100) прочитает только первые 100 символов.

with open("file.txt", "r") as file:
    content = file.read()  # Весь текст в одной строке

readline() — считывает содержимое файла построчно. После каждой строки функция сохраняет символ переноса (\n). Если в документе есть пустая строка, то функция тоже её считает.

with open('file.txt') as file:
    line1 = file.readline()  # Первая строка
    print(line1)
    line2 = file.readline()  # Вторая строка
    print(line2)

readlines() — считывает строки файла и помещает их в список. Каждая строка — элемент списка. Функция подходит, если нужно обработать строки отдельно.

with open("file.txt", "r") as file:
    lines = file.readlines()

for line in file — это цикл, с помощью которого можно построчно прочитать содержимое файла и отдельно обработать каждую строку. Этот способ особенно удобен для работы с большими файлами, так как цикл не загружает в память файл целиком.

with open("file.txt", "r") as file:
    for line in file:  # Читает файл построчно, не загружая в память целиком
        print(line.strip())

Запись в файл

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

write() — функция для записи в файл целой строки. Если надо разбить текст на несколько строк, то следует использовать символ перевода строки (\n):

with open("file.txt", "w") as file:
    file.write("Первая строка\n")
    file.write("Вторая строка\n")

Особенность функции write() в том, что она работает только со строками. Если в файл надо добавить числа, то не получится обойтись без преобразования типов данных:

file.write(str(42))  # Число → строка

writelines() — функция для записи списка строк. В качестве аргумента она принимает список, элементы которого — строки.

lines = ["Первая строка\n", "Вторая строка\n"]
with open("file.txt", "w") as file:
    file.writelines(lines)  # Записывает все элементы списка

Хотя функцию print() в Python обычно используют для вывода в консоль, с помощью параметра file её можно применить и для записи в файл. Этот способ удобен тем, что символ перехода на новую строку добавляется автоматически.

with open("file.txt", "w") as f:
    print("Первая строка", file=f)
    print("Вторая строка", file=f)

Управление курсором

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

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

with open('file.txt', 'r') as f:
    print(f)
    print(f"Начальная позиция: {f.tell()}")  # Выведет 0
    first_line = f.readline()
    print(f"Прочитана строка: '{first_line.strip()}', текущая позиция: {f.tell()}") # Выведет позицию первого символа второй строки

seek(offset, whence=0) — перемещает курсор на новую позицию в файле. В качестве аргументов функции надо передать количество байтов (offset), на которое должен сместиться курсор, и относительную позицию смещения (whence). Для последнего аргумента по умолчанию установлено значение 0 — смещение от начала файла, но есть и другие варианты:

  • 1 — от текущей позиции курсора;
  • 2 — от конца файла.

Например, вот так можно переместить курсор на 10 байт от начала файла:

with open('example.txt', 'r') as file:
    file.seek(10)  # Перемещаем указатель на 10 байт от начала файла
    data = file.read(5)  # Читаем 5 байт с позиции 10

Как закрыть файл

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

В Python файлы закрывают с помощью функции close():

# Открываем файл
file = open('example.txt', 'r')
    # Вносим изменения
file.close()  # Закрываем файл

Для удобства можно использовать конструкцию with open(…) as — она автоматически закрывает файлы, а код с ней становится чище и понятнее. Вот как пользоваться этой конструкцией:

with open('example.txt', 'r') as f:
   content = f.read()
   print(content)

Как управлять файлами в ОС

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

Список основных функций для управления файлами с помощью Python:

  • os.path.exists('имя_файла') — проверяет, существует ли документ с указанным именем;
  • os.remove('имя_файла') — удаляет документ;
  • os.rename('старое_имя', 'новое_имя') — переименовывает документ.
  • shutil.move('старая_папка/file.txt', 'новая_папка/file.txt') — перемещает файл из одной папки в другую.
  • os.listdir('папка') — выводит содержимое папки.

Для примера напишем программу, которая создаёт файл, копирует его и удаляет оригинал:

import os
import shutil

# Создаём файл original.txt и записываем в него строку
file_path = 'original.txt'
with open(file_path, 'w') as f:
    f.write("Это оригинальный файл.\n")


# Проверяем, существует ли файл
if os.path.exists(file_path):
    print("Файл успешно создан:", file_path)


# Копируем файл
shutil.copy(file_path, 'copy.txt')
print("Файл скопирован как copy.txt")


# Переименовываем копию
os.rename('copy.txt', 'renamed_copy.txt')
print("Файл переименован в renamed_copy.txt")


# Удаляем оригинальный файл
os.remove(file_path)
print("Оригинальный файл удалён")


# Проверяем, существует ли переименованная копия файла
if os.path.exists('renamed_copy.txt'):
    print("Копия файла существует!")

Что запомнить

  • В Python можно работать как с текстовыми, так и с бинарными файлами, а все функции для этого доступны в стандартной библиотеке.
  • Перед тем как вносить изменения в файл, его надо открыть с помощью функции open(). В качестве аргумента следует указать режим работы с документом. Он определяет, какие именно функции после этого можно будет применять к файлу.
  • После работы с документом надо обязательно закрыть файл с помощью функции close(). Если этого не сделать, данные могут не сохраниться.
  • В Python-модулях os, shutil, pathlib есть функции для работы с файловой системой. С их помощью можно создавать документы и папки, копировать их, удалять и переименовывать.

Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!



Курс с трудоустройством: «Профессия Python-разработчик» Узнать о курсе
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована