Взаимодействие с файловой системой через Python

В прошлой статье мы говорили о работе с файлами в 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-специалистов в Москве.

Источники
  1. https://docs.python.org/3/library/os.html

Добавить комментарий

Поиск по сайту