В прошлой статье мы говорили о работе с файлами в Python. Файлы и папки можно также организовывать по каталогам, что очень удобно, например, в Google Colab. Сегодня рассмотрим управление файлами и папками с помощью Python-модуля os. Читайте далее, что такой текущий рабочий каталог; вывод всех файлов и папок; создание, переименование и удаление папок и файлов; а также обход дерева каталогов.
Текущая рабочая директория
Python работает с файловой системой относительно текущей рабочей директории. Чтобы узнать, какая она на вашей операционной системе, используется функция getcwd (cwd расшифровывается как current working directory):
>>> os.getcwd() '/home/root'
Функция 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 в случае, если пути не существует, создаст его. Поэтому если вам требуются также и подпапки, используйте именно ее.
>>> os.makedirs('dir2/sub-dir')
Переименовываем файлы и папки
Функция rename изменит имя файла или папки, если они существуют. Функция не сможет переименовать папку в название, которое уже существует в каталоге, если она что-то внутри содержит.
>>> os.rename('dir', 'tmpdir') # все ок
>>> os.rename('tmpdir', 'Videos')
---------------------------------------------------------------------------
OSError: [Errno 39] Directory not empty: 'dir' -> 'Videos'
Удаляем папки и файлы
Для удаления файла используется функция remove. Ниже Python-код удалит file:
>>> os.remove('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-специалистов в Москве.



