- Работа с файлами в Python с помощью модуля OS
- Вывод текущей директории
- Создание папки
- Изменение директории
- Создание вложенных папок
- Создание файлов
- Переименование файлов
- Перемещение файлов
- Список файлов и директорий
- Удаление файлов
- Удаление директорий
- Получение информации о файлах
- Выводы
- Взаимодействие с файловой системой через Python
- Текущая рабочая директория
- Получение списков файлов и папок
- Создаем папки в Python
- Переименовываем файлы и папки
- Удаляем папки и файлы
- Извлекаем информацию из файлов и папок
- Гуляем по каталогу
Работа с файлами в Python с помощью модуля OS
Обработка файлов в Python с помощью модуля os включает создание, переименование, перемещение, удаление файлов и папок, а также получение списка всех файлов и каталогов и многое другое.
В индустрии программного обеспечения большинство программ тем или иным образом обрабатывают файлы: создают их, переименовывают, перемещают и так далее. Любой программист должен обладать таким навыком. С этим руководством вы научитесь использовать модуль os в Python для проведения операций над файлами и каталогами вне зависимости от используемой операционной системы.
Важно знать, что модуль os используется не только для работы с файлами. Он включает массу методов и инструментов для других операций: обработки переменных среды, управления системными процессами, а также аргументы командной строки и даже расширенные атрибуты файлов, которые есть только в Linux.
Модуль встроенный, поэтому для работы с ним не нужно ничего устанавливать.
Вывод текущей директории
Для получения текущего рабочего каталога используется os.getcwd() :
import os # вывести текущую директорию print("Текущая деректория:", os.getcwd())
os.getcwd() возвращает строку в Юникоде, представляющую текущий рабочий каталог. Вот пример вывода:
Текущая деректория: C:\python3\bin
Создание папки
Для создания папки/каталога в любой операционной системе нужна следующая команда:
# создать пустой каталог (папку) os.mkdir("folder")
После ее выполнения в текущем рабочем каталоге тут же появится новая папка с названием «folder».
Если запустить ее еще раз, будет вызвана ошибка FileExistsError , потому что такая папка уже есть. Для решения проблемы нужно запускать команду только в том случае, если каталога с таким же именем нет. Этого можно добиться следующим образом:
# повторный запуск mkdir с тем же именем вызывает FileExistsError, # вместо этого запустите: if not os.path.isdir("folder"): os.mkdir("folder")
Функция os.path.isdir() вернет True , если переданное имя ссылается на существующий каталог.
Изменение директории
Менять директории довольно просто. Проделаем это с только что созданным:
# изменение текущего каталога на 'folder' os.chdir("folder")
Еще раз выведем рабочий каталог:
# вывод текущей папки print("Текущая директория изменилась на folder:", os.getcwd())
Текущая директория изменилась на folder: C:\python3\bin\folder
Создание вложенных папок
Предположим, вы хотите создать не только одну папку, но и несколько вложенных:
# вернуться в предыдущую директорию os.chdir("..") # сделать несколько вложенных папок os.makedirs("nested1/nested2/nested3")
Это создаст три папки рекурсивно, как показано на следующем изображении:
Создание файлов
Для создания файлов в Python модули не нужны. Можно использовать встроенную функцию open() . Она принимает название файла, который необходимо создать в качестве первого параметра и желаемый режим открытия — как второй:
# создать новый текстовый файл text_file = open("text.txt", "w") # запить текста в этот файл text_file.write("Это текстовый файл")
w значит write (запись), a — это appending (добавление данных к уже существующему файлу), а r — reading (чтение). Больше о режимах открытия можно почитать здесь.
Переименование файлов
С помощью модуля os достаточно просто переименовать файл. Поменяем название созданного в прошлом шаге.
# переименовать text.txt на renamed-text.txt os.rename("text.txt", "renamed-text.txt")
Функция os.rename() принимает 2 аргумента: имя файла или папки, которые нужно переименовать и новое имя.
Перемещение файлов
Функцию os.replace() можно использовать для перемещения файлов или каталогов:
# заменить (переместить) этот файл в другой каталог os.replace("renamed-text.txt", "folder/renamed-text.txt")
Стоит обратить внимание, что это перезапишет путь, поэтому если в папке folder уже есть файл с таким же именем ( renamed-text.txt ), он будет перезаписан.
Список файлов и директорий
# распечатать все файлы и папки в текущем каталоге print("Все папки и файлы:", os.listdir())
Функция os.listdir() возвращает список, который содержит имена файлов в папке. Если в качестве аргумента не указывать ничего, вернется список файлов и папок текущего рабочего каталога:
Все папки и файлы: ['folder', 'handling-files', 'nested1', 'text.txt']
А что если нужно узнать состав и этих папок тоже? Для этого нужно использовать функцию os.walk() :
# распечатать все файлы и папки рекурсивно for dirpath, dirnames, filenames in os.walk("."): # перебрать каталоги for dirname in dirnames: print("Каталог:", os.path.join(dirpath, dirname)) # перебрать файлы for filename in filenames: print("Файл:", os.path.join(dirpath, filename))
os.walk() — это генератор дерева каталогов. Он будет перебирать все переданные составляющие. Здесь в качестве аргумента передано значение «.», которое обозначает верхушку дерева:
Каталог: .\folder Каталог: .\handling-files Каталог: .\nested1 Файл: .\text.txt Файл: .\handling-files\listing_files.py Файл: .\handling-files\README.md Каталог: .\nested1\nested2 Каталог: .\nested1\nested2\nested3
Метод os.path.join() был использован для объединения текущего пути с именем файла/папки.
Удаление файлов
# удалить этот файл os.remove("folder/renamed-text.txt")
os.remove() удалит файл с указанным именем (не каталог).
Удаление директорий
С помощью функции os.rmdir() можно удалить указанную папку:
# удалить папку os.rmdir("folder")
Для удаления каталогов рекурсивно необходимо использовать os.removedirs() :
# удалить вложенные папки os.removedirs("nested1/nested2/nested3")
Это удалит только пустые каталоги.
Получение информации о файлах
Для получения информации о файле в ОС используется функция os.stat() , которая выполняет системный вызов stat() по выбранному пути:
open("text.txt", "w").write("Это текстовый файл") # вывести некоторые данные о файле print(os.stat("text.txt"))
os.stat_result(st_mode=33206, st_ino=14355223812608232, st_dev=1558443184, st_nlink=1, st_uid=0, st_gid=0, st_size=19, st_atime=1575967618, st_mtime=1575967618, st_ctime=1575966941)
Это вернет кортеж с отдельными метриками. В их числе есть следующие:
-
- st_size — размер файла в байтах
- st_atime — время последнего доступа в секундах (временная метка)
- st_mtime — время последнего изменения
- st_ctime — в Windows это время создания файла, а в Linux — последнего изменения метаданных
Для получения конкретного атрибута нужно писать следующим образом:
# например, получить размер файла print("Размер файла:", os.stat("text.txt").st_size)
Выводы
Работать с файлами и каталогами в Python очень просто. Не имеет значения даже используемая операционная система, хотя отдельные уникальные для системы функции можно использовать: например, os.chown() или os.chmod() в Linux. Более подробно эта тема освещена в официальной документации Python.
Взаимодействие с файловой системой через Python
В прошлой статье мы говорили о работе с файлами в Python. Файлы и папки можно также организовывать по каталогам, что очень удобно, например, в Google Colab. Сегодня рассмотрим управление файлами и папками с помощью Python-модуля os. Читайте далее, что такой текущий рабочий каталог; вывод всех файлов и папок; создание, переименование и удаление папок и файлов; а также обход дерева каталогов.
Текущая рабочая директория
Python работает с файловой системой относительно текущей рабочей директории. Чтобы узнать, какая она на вашей операционной системе, используется функция getcwd (cwd расшифровывается как current working directory):
Функция chdir сменит ее на другую, которая будет указана аргументом:
>>> os.chdir('/home/root/Documents') >>> os.getcwd() home/root/Documents'
Получение списков файлов и папок
Функция listdir без указания аргумента покажет все файлы и папки текущей рабочей директории. Можно также указать аргументом интересующий вас путь. Ниже представлен код на Python.
>>> os.listdir() ['Documents', 'Music', 'Public', 'Videos', 'Desktop', 'Downloads', 'Pictures', 'Templates']
Создаем папки в Python
Чтобы создать одну папку, применяется функция mkdir . Эта функция сможет создать только одну папку в существующем пути, если указанного пути не существует, то вызовется ошибка. Ниже это показывает код на Python:
>>> os.mkdir('dir') # все ок >>> os.mkdir('dir2/sub-dir') # папки dir2 не существует --------------------------------------------------------------------------- ----> 1 os.mkdir('dir2/sub-dir') FileNotFoundError: [Errno 2] No such file or directory: 'dir2/sub-dir'
А вот функция makedirs в случае, если пути не существует, создаст его. Поэтому если вам требуются также и подпапки, используйте именно ее.
Переименовываем файлы и папки
Функция rename изменит имя файла или папки, если они существуют. Функция не сможет переименовать папку в название, которое уже существует в каталоге, если она что-то внутри содержит.
>>> os.rename('dir', 'tmpdir') # все ок >>> os.rename('tmpdir', 'Videos') --------------------------------------------------------------------------- OSError: [Errno 39] Directory not empty: 'dir' -> 'Videos'
Удаляем папки и файлы
Для удаления файла используется функция remove . Ниже Python-код удалит file:
Удалить одну папку можно с функцией rmdir . А вот за удаление целого каталога отвечает removedirs . Например, имеется каталог dir/sub-dir, тогда rmdir(‘dir/sub-dir’) удалит только папку sub-dir, а removedirs(‘dir/sub-dir’) удалит и dir, и sub-dir. Примеры на Python:
>>> os.rmdir('direct') # удалит папку >>> os.makedirs('dir/sub-dir') # удалит каталог
Извлекаем информацию из файлов и папок
Функция stat вернет статус файла или папки. Статус имеет много атрибутов, но наиболее полезный из них — st_mtime , который содержит время последнего изменения содержимого в секундах (modification time). Это время можно преобразовать в datetime, о котором мы говорили тут. Вот так, в итоге, будет выглядеть Python-код:
>>> from datetime import datetime >>> cwd = os.getcwd() >>> status_info = os.stat(cwd) >>> datetime.fromtimestamp(status_info.st_mtime) datetime.datetime(2020, 9, 3, 13, 12, 13, 825475)
Гуляем по каталогу
Функция walk сгенерирует все дерево каталога. Поскольку возвращается генератор, то по нему можно итерироваться, причем генератор производит кортеж из трех значений: путь до папки, имя папки, имя файлов. Код на Python ниже демонстрирует это на примере каталога tmpdir, который имеет папки и файлы, а внутри этих папок также имеются файлы и папки.
>>> route = '/home/root/tmpdir' >>> for dirpath, dirnames, filenames in os.walk(route): . print('Текущий путь:', dirpath) . print('Папки:', dirnames) . print('Файлы:', filenames) . print() . Текущий путь: /home/root/tmpdir Папки: ['sub2-dir', 'sub3-dir'] Файлы: ['thisisfile.bat'] Текущий путь: /home/root/tmpdir/sub2-dir Папки: ['sub2-dir2', 'sub2-dir1'] Файлы: ['somefile.txt'] Текущий путь: /home/root/tmpdir/sub2-dir/sub2-dir2 Папки: [] Файлы: [] Текущий путь: /home/root/tmpdir/sub2-dir/sub2-dir1 Папки: [] Файлы: ['sub2-dir1_file.txt'] Текущий путь: /home/root/tmpdir/sub3-dir Папки: [] Файлы: ['file.bin']
В следующей статье рассмотрим модули управления путями файловой системы с os.path и pathlib . А как работать с файловой системой в Python на практических примерах реальных Data Science проектов, вы узнаете на наших курсах в лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.