🐍 Самоучитель по Python для начинающих. Часть 15: Методы работы с файлами и файловой системой
Научимся создавать, переносить и удалять файлы и директории, а в конце статьи – решим 10 практических задач, связанных с чтением информации и с записью данных в текстовые файлы.
Для работы с файловой системой в Python используют модули
os, os.path и shututil, а для операций с файлами –встроенные функции open(), close(),read(), readline(), write() и т. д. Прежде, чем мы перейдем
к примерам использования конкретных методов, отметим один важный момент – корректный формат пути к файлам и каталогам.
Дело в том, что Pythonсчитает некорректным стандартный
для Windowsформат: если указать путь к файлу в привычном виде 'C:\Users\User\Python\letters.py', интерпретатор вернет ошибку. Лучше
всего указывать путь с помощью r-строк
или с экранированием слэшей:
Метод getcwd() возвращает
путь к текущей рабочей директории в виде строки:
С помощью метода os.listdir() можно получить список всех поддиректорий и файлов текущего рабочего каталога, при этом содержимое вложенных папок не отображается:
Метод os.walk() возвращает генератор, в котором содержится
вся информация о рабочем каталоге, включая содержимое всех поддиректорий:
Много полезных методов содержится в модуле os.path. Так можно извлечь имя файла из полного пути:
А так можно получить путь к директории / файлу, в который не
включается собственно поддиректория или имя файла:
Метод path.isabs() покажет, является ли
путь абсолютным или относительным:
Метод path.isdir() возвращает True, если переданная в метод директория существует, и False – в противном случае:
Для установления факта существования файла служит path.isfile():
Для преобразования пути в нижний регистр и нормализации слэшей используют path.normcase():
Хотя путь к файлу (директории) представляет собой строку,
создавать полный путь с помощью конкатенации считается моветоном – нужно
использовать метод os.path.join():
Результат:
Операции с каталогами и файлами в Python
Для создания новых директорий служит os.mkdir(); в метод нужно передать полный путь, включающий название
нового каталога:
Результат:
Изменить рабочую директорию можно с помощью метода os.chdir(), это аналог CLI команды cd:
Использование os.chdir()
может привести к ошибке, если путь к переданной в метод директории указан
неправильно или не существует. Поэтому этот метод стоит использовать только с
обработкой ошибок:
Вывод:
Создание директорий в Python
Для создания новых каталогов используют два метода:
os.mkdir() – аналог CLI команды mkdir; создает новую папку по указанному пути, при условии, что все указанные промежуточные (вложенные) директории уже существуют.
os.makedirs() – аналог CLI команды mkdir -p dir1\dir2; помимо создания целевой папки, создает все промежуточные директории, если они не существуют.
Пример использования os.mkdir():
Результат:
Пример использования makedirs():
Результат:
Копирование файлов и директорий в Python
Для копирования файлов используют метод shutil.copy2(), который принимает два аргумента
– источник файла и директорию, в которую нужно скопировать файл:
Вывод:
Помимо метода shutil.copy2(),
для копирования файлов можно пользоваться методом shutil.copy(). Разница между
этими двумя методами в том, что в отличие от shutil.copy2(),
метод shutil.copy() копирует только
содержимое файла, но не метаданные:
Вывод:
Все содержимое каталога сразу можно скопировать с помощью shutil.copytree():
Вывод:
Перемещение файлов и директорий
Для перемещения файлов используют метод shutil.move():
Вывод:
Для перемещения содержимого всей директории в качестве
функции указывают shutil.copytree():
Удаление файлов и директорий
Для удаления директории вместе со всеми файлами используют shutil.rmtree():
Вывод:
Другой метод для удаления пустых директорий – os.rmdir():
Вывод:
Очевидный минус метода os.rmdir()
в том, что он работает только на пустых директориях – если поместить в каталог Scripts хотя бы один файл,
удалить его с os.rmdir() уже не получится:
Для удаления файлов используют метод os.remove():
Вывод:
Работа с файлами в Python
Открыть файл для проведения каких-либо манипуляций можно
двумя способами:
С помощью функции open() – в этом случае после завершения работы нужно будет закрыть файл с помощью close():
С использованием менеджера контекста with, который автоматически и самостоятельно закроет файл, когда надобность в нем отпадет:
Типы файлов
В Pythonвсе файлы делятся на:
Текстовые 't'
Бинарные (двоичные) 'b'
Если никакой определенный тип файла не указан, по умолчанию Python считает, что пользователь работает с текстовыми файлами. Поэтому для работы с изображениями, мультимедийными файлами и pdf, например, следует указывать, что тип файла относится к 'b'.
Режимы доступа и записи
'r'
Открывает файл для чтения. Возвращает ошибку, если указанный файл не существует.
'w'
Открывает файл для записи, причем перезаписывает содержимое, если оно есть. Создает файл, если он не существует.
'a'
Открывает файл для записи и добавляет новую информацию, не перезаписывая существующую. Создает файл, если он не существует.
'w+'
Открывает файл для чтения и записи, перезаписывает содержимое.
'r+'
Открывает файл для чтения и дополнения, не перезаписывает содержимое.
'x'
Создает новый пустой файл. Возвращает ошибку, если файл с таким именем уже существует.
Примечание: для операций с двоичными файлами к указанным
параметрам нужно добавлять b,
то есть вместо 'r'
должно быть 'rb', а
вместо 'w+' – 'wb+'.
Методы работы с файлами
Для чтения данных используют read(). Методread() по умолчанию возвращает все содержимое файла:
Вывод:
При необходимости объем выводимой информации можно ограничить
определенным количеством символов:
Вывод:
Метод readline()
позволяет считывать информацию из текстовых файлов построчно:
Вывод:
Для получения всех строк файла используют метод readlines(),
который возвращает содержимое в виде списка – вместе со всеми спецсимволами:
Вывод:
Чтобы избавиться от лишних пробелов, символа новой строки (и любых других
спецсимволов), используют методы rstrip(), lstrip()
илиstrip():
Вывод:
Для записи информации в файл используют метод write():
Или writelines():
Кроме того, записывать данные в файл можно с помощью print():
Чтобы узнать текущую позицию курсора в файле, используют метод tell():
Вывод:
Для считывания данных из определенной позиции используют seek():
Вывод:
Практика
Задание 1
Имеется файлbooks.txt, содержащий следующую
информацию:
Напишите программу, которая выводит первые 3 строки файла.
Решение:
Задание 2
Напишите программу, которая получает от пользователя имя
файла и возвращает следующие данные о его содержимом:
количество строк;
количество слов;
число символов без пробелов и точек.
Пример ввода:
Содержимое файла:
Вывод:
Решение:
Задание 3
Напишите программу, которая находит самое длинное слово в
списке книг из первого задания.
Ожидаемый результат:
Решение:
Задание 4
Имеется файл fruit.txtсо
следующим содержимым:
Напишите программу, которая подсчитывает, сколько раз
название каждого фрукта встречается в тексте.
Вывод:
Решение:
Задание 5
Имеются два файла, first.txtи second.txt. В первом файле
перечислены имена, во втором – должности:
Содержимое файла first.txt
Файл second.txt
Напишите программу, которая открывает оба файла и выводит
сведения о сотрудниках в следующем формате:
Решение:
Задание 6
Напишите программу, которая:
генерирует коды букв русского алфавита от а до я;
вставляет в полученный список код ё;
записывает полный алфавит (строчный и прописной варианты каждой буквы) в столбик в файл alphabet.txt.
Содержимое файла после выполнения программы:
Решение:
Задание 7
Сведения о доходах и расходах компании хранятся в двух
файлах, income.txtи
outcome.txt. Напишите программу для
подсчета прибыли компании.
Пример файла income.txt:
Пример файла outcome.txt:
Ожидаемый результат:
Решение:
Задание 8
Напишите программу, которая считывает сведения об
успеваемости по основным предметам из файла grades.txt,
и определяет, кто из студентов имеет средний балл >= 4.5.
Пример файла grades.txt:
Ожидаемый результат:
Решение:
Задание 9
Напишите программу, которая получает от пользователя
название файла с информацией на русском языке, и выполняет транслитерацию
текста в соответствии с приведенным ниже словарем. Результат нужно записать в
файл result.txt.
Словарь:
Пример русского текста:
Ожидаемое содержимое result.txt:
Решение:
Задание 10
Имеется лог-файл crm_log.txtс
информацией о времени входа пользователей в CRM-систему и о времени выхода. Напишите программу, которая
определяет пользователей, работавших в системе более 4 часов, и записывает их
имена и фамилии в файл best_employees.txt.
Пример лога crm_log.txt:
Ожидаемый результат в файле best_employees.txt:
Решение:
Подведем итоги
Python
предоставляет множество простых и удобных методов для работы с файловой
системой и файлами. С помощью этих методов можно легко:
Получать любую информацию о файлах и директориях.
Создавать, изменять, перемещать и удалять директории и файлы.
Проводить любые операции с содержимым текстовых и двоичных файлов.
В следующей статье будем изучать регулярные выражения.