Модуль Python OS используется для работы с операционной системой и является достаточно большим, что бы более конкретно описать его применение. С помощью его мы можем получать переменные окружения PATH, названия операционных систем, менять права на файлах и многое другое. В этой статье речь пойдет про работу с папками и путями, их создание, получение списка файлов и проверка на существование. Примеры приведены с Python 3, но и с предыдущими версиями ошибок быть не должно.
Модуль OS не нуждается в дополнительной установке, так как поставляется вместе с инсталлятором Python.
Получение директорий и списка файлов
Есть несколько способов вернуть список каталогов и файлов по указанному пути. Первый способ используя os.walk, который возвращает генератор:
import os
path = 'C:/windows/system32/drivers/'
print(path)
Такие объекты можно итерировать для понятного отображения структуры:
import os
path = 'C:/Folder1'
for el in os.walk(path):
print(el)
Сам кортеж делится на 3 объекта: текущая директория, имя вложенных папок (если есть), список файлов. Я так же разделил их на примере ниже:
import os
path = 'C:/Folder1'
for dirs,folder,files in os.walk(path):
print('Выбранный каталог: ', dirs)
print('Вложенные папки: ', folder)
print('Файлы в папке: ', files)
print('\n')
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))
Получение файлов через listdir
Есть еще один метод получения файлов используя listdir. Отличия от предыдущего метода в том, что у нас не будет разделения файлов и папок. Он так же не является рекурсивным:
import os
path = 'C:/Folder1'
directory = os.listdir(path)
print(directory)
Получение полного абсолютного пути к файлам
Для последующего чтения файла нам может понадобится абсолютный путь. Мы можем использовать обычный метод сложения строк или метод 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.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.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.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')
Если попытаться создать несколько вложенных папок сразу, используя предыдущий пример, появится ошибка 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)
Получение и изменение текущей директории
Запуская любую программу или консоль, например CMD, мы это делаем из определенной директории. С этой и соседней директорией мы можем работать без указания полного пути. Для того что бы узнать такую директорию в Python используется метод os.getcwd():
import os
current_dir = os.getcwd()
print(current_dir)
В директории 'D:\' сохранен мой файл, с которого я запускаю методы. Вы можете изменить такую директорию с os.chdir() . Такой подход удобен, когда файлы, с которыми вы работаете в основном находятся в другом месте и вы сможете избежать написания полного пути:
import os
current_dir = os.getcwd()
print(current_dir)
new_dir = os.chdir('D:/newfolder/')
print(os.getcwd())
Так же как и в любых языках, в любых методах описанных выше, вы можете использовать '..' для работы с директорией выше или '/' для работы со внутренней:
import os
# Текущая директория
print(os.getcwd())
# Переход во внутреннюю
old_dir = os.chdir('/newfolder/')
print(os.getcwd())
# Переход на уровень выше
new_dir = os.chdir('..')
print(os.getcwd())
...