Модуль Python os - примеры создания и работы с папками и путями


21 февраля 2020


Работа с папками и создание путей с модулем OS в Python

Модуль Python OS используется для работы с операционной системой и является достаточно большим, что бы более конкретно описать его применение. С помощью его мы можем получать переменные окружения PATH, названия операционных систем, менять права на файлах и многое другое. В этой статье речь пойдет про работу с папками и путями, их создание, получение списка файлов и проверка на существование. Примеры приведены с Python 3, но и с предыдущими версиями ошибок быть не должно.

Модуль OS не нуждается в дополнительной установке, так как поставляется вместе с инсталлятором Python.

Получение директорий и списка файлов

Есть несколько способов вернуть список каталогов и файлов по указанному пути. Первый способ используя os.walk, который возвращает генератор:

import os

path = 'C:/windows/system32/drivers/'
print(path)

Получение списка папок и файлов с библиотекой os в Python

Такие объекты можно итерировать для понятного отображения структуры:

import os

path = 'C:/Folder1'
for el in os.walk(path):
    print(el)

Обработка списка директорий и файлов с библиотекой os в Python

Сам кортеж делится на 3 объекта: текущая директория, имя вложенных папок (если есть), список файлов. Я так же разделил их на примере ниже:

import os

path = 'C:/Folder1'
for dirs,folder,files in os.walk(path):
    print('Выбранный каталог: ', dirs)
    print('Вложенные папки: ', folder)
    print('Файлы в папке: ', files)
    print('\n')

Разделение директорий и папок с библиотекой os в Python

Os.walk является рекурсивным методом. Это значит, что для поиска файлов в конкретной директории вы будете итерировать и все вложенные папки. Обойти это с помощью самого метода нельзя, но вы можете использовать break так как os.walk возвращает указанную директорию первой. Можно так же использовать next():

import os

path = 'C:/Folder1'
for dirs,folder,files in os.walk(path):
    print('Выбранный каталог: ', dirs)
    print('Вложенные папки: ', folder)
    print('Файлы в папке: ', files)
    print('\n')
    # Отобразит только корневую папку и остановит цикл
    break

# Отобразит первый итерируемый объект
directory = os.walk(path)
print(next(directory))

Вывод первой директории с OS walk в Python

Получение файлов через listdir

Есть еще один метод получения файлов используя listdir. Отличия от предыдущего метода в том, что у нас не будет разделения файлов и папок. Он так же не является рекурсивным:

import os

path = 'C:/Folder1'
directory = os.listdir(path)
print(directory)

Вывод списка файлов и папок с библиотекой os.listdir в Python

Получение полного абсолютного пути к файлам

Для последующего чтения файла нам может понадобится абсолютный путь. Мы можем использовать обычный метод сложения строк или метод os.path.join, который сделает то же самое, но и снизит вероятность ошибки если программа работает на разных ОС:

import os

path = 'C:/Folder1'
for dirs,folder,files in os.walk(path):
    print('Выбранный каталог: ', dirs)
    print('Вложенные папки: ', folder)
    print('Файлы в папке: ', files)
    print('Полный путь к файлу: ', os.path.join(dirs, files))
    

Получение абсолютного пути с os.path.join в Python

Исключение каталогов или файлов из списка

У нас может быть список полных путей, например из списка выше, из которого мы хотим исключить папки или файлы. Для этого используется os.path.isfile:

import os

path = ['C:/Folder1',
        'C:/Folder1/Folder2/file2.txt']
for el in path:
    if os.path.isfile(el):
        print('Это файл: ', el)
    else:
        print('Это папка: ', el)

Проверка папок и файлов с os.path.os.isfile()

Такой же принцип имеют следующие методы:

  • os.path.isdir() - относится ли путь к папке;
  • os.path.islink() - относится ли путь к ссылке;

Получение расширения файлов

Расширение файла можно получить с помощью os.path.splittext(). Этот метод вернет путь до расширения и само расширение. Этот метод исключает ситуацию, когда точка может стоять в самом пути. Если в качестве пути мы выберем каталог (который не имеет расширения) , результатом будет пустая строка:

import os

path = ['C:/Folder1',
        'C:/Folder1/Folder2/file2.txt']
for el in path:
    print(os.path.splitext(el))

Получение расширений файлов с os.path.splittext в Python

os.path.basename(path) - вернет имя файла и расширение.

 

Создание и удаление директорий

Методы по изменению папок следующие:

  • os.mkdir() - создаст папку;
  • os.rename() - переименует;
  • os.rmdir() - удалит.
import os

# Имя новой папки
path = 'C:/Folder1/NewFolder'
# Ее создание
os.mkdir(path)
# Переименуем папку
os.rename(path, 'C:/Folder1/NewFolder2')
# Удалим
os.rmdir('C:/Folder1/NewFolder2')
    

Создание и удаление директорий в Python с os.mkdir и os.rmdir

Если попытаться создать несколько вложенных папок сразу, используя предыдущий пример, появится ошибка FileNotFoundError. Создание папок включая промежуточные выполняется с os.makedirs():

import os

path = 'C:/Folder1/Folder1/Folder1/'
os.makedirs(path)

Проверка директорий и файлов на существование

Если мы пытаемся создать папку с существующим именем, то получим ошибку FileExistsError. Один из способов этого избежать - использование os.path.exists(), который вернет True в случае существования файла или папки:

import os

path = ['C:/Folder1/file1.txt',
		'C:/Folder1/NotExistFolder']
for el in path:
	if os.path.exists(el):
		print('Такой путь существует: ', el)
	else:
		print('Такого пути нет', el)

Проверка существование пути с os.path.exists в Python

 

Получение и изменение текущей директории

Запуская любую программу или консоль, например CMD, мы это делаем из определенной директории. С этой и соседней директорией мы можем работать без указания полного пути. Для того что бы узнать такую директорию в Python используется метод os.getcwd():

import os

current_dir = os.getcwd()
print(current_dir)

Получение текущей директории с os.getcwd в Python

В директории 'D:\' сохранен мой файл, с которого я запускаю методы. Вы можете изменить такую директорию с os.chdir() . Такой подход удобен, когда файлы, с которыми вы работаете в основном находятся в другом месте и вы сможете избежать написания полного пути:

import os

current_dir = os.getcwd()
print(current_dir)
new_dir = os.chdir('D:/newfolder/')
print(os.getcwd())

Изменение директории с Python  os.chdir

Так же как и в любых языках, в любых методах описанных выше, вы можете использовать '..' для работы с директорией выше или '/' для работы со внутренней:

import os

# Текущая директория
print(os.getcwd())
# Переход во внутреннюю
old_dir = os.chdir('/newfolder/')
print(os.getcwd())
# Переход на уровень выше
new_dir = os.chdir('..')
print(os.getcwd())

Переход на уровень выше и ниже с os.chdir в Python 

...

Теги: #python #os


Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.