Os walk что это
Перейти к содержимому

Os walk что это

Примеры использования модуля os в Python

Данный модуль можно применять во многих случаях. В данном разделе мы не рассмотрим каждый из них. Вместо этого, мы рассмотрим, как именно его можно применять, а также ознакомимся с подмодулем, под названием os.path. В частности, мы расскажем о:

  • os.name
  • os.environ
  • os.chdir()
  • os.getcwd()
  • os.getenv()
  • os.putenv()
  • os.mkdir()
  • os.makedirs()
  • os.remove()
  • os.rename()
  • os.rmdir()
  • os.startfile()
  • os.walk()
  • os.path

Это может выглядеть как большой объем материала, но есть еще минимум десяток других задач, которые модуль os может выполнять. Так что данный раздел можно назвать кратким экскурсом. Для использования любого из методов, упомянутых в данном разделе, вам нужно импортировать модуль os, вот так:

os.name

Модуль os обладает как вызываемыми функциями, так и обычными значениями. В случае с os.name, речь идет только о значениях. При доступе к os.name, вы получите информацию о том, с какой платформой вы работаете. Вам откроются следующие значения: ‘posix’, ‘nt’, ‘os2’, ‘ce’, ‘java’, ‘riscos’. Давайте посмотрим на то, что выйдет, если запустить его на Windows 7:

Это говорит нам о том, что наш экземпляр Пайтон работает в окне Windows. Как мы об этом узнали? Майкрософт начали называть свою операционную систему NT много лет назад. Например, Windows 7 также носит имя Windows NT 6.1.

os.environ, os.getenv() и os.putenv()

Значение os.environ известно как объект мэппинга (сопоставления), который работает со словарем переменных пользовательской среды. Возможно вы не знали, но каждый раз, когда вы пользуетесь своим компьютером, некоторые переменные среды уже установлены.

Это дает вам полезную информацию, такую как количество процессоров, тип ОЗУ, имя компьютера, и так далее. Посмотрим, что мы сможем узнать о нашем компьютере:

Ваши данные будут отличаться от моих, так как конфигурация компьютера у всех немного отличается, однако вы определенно увидите большое количество совпадений. Как вы могли заметить, это вернуло словарь. Это значит, что вы можете получить доступ к значениям среды, пользуясь обычными словарными методами. Например:

Вы также можете использовать функцию os.getenv для доступа к этой переменной:

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

Результат выполнения данного скрипта:

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

os.chdir() и os.getcwd()

Функция os.chdir позволяет нам вносить изменения в каталоге, который мы в данный момент используем в сессии. Если вам нужно знать, какой путь вы в данный момент используете, для этой нужно вызвать os.getcwd(). Попробуем воспользоваться обоими модулями:

Указанный код демонстрирует нам, что мы открыли директорию по умолчанию в Пайтоне, после запуска данного кода в IDLE. После этого мы изменили папки, при помощи os.chdir(). Наконец, мы вызывали os.getcwd() еще раз, чтобы убедиться, что все изменения были выполнены правильно.

os.mkdir() и os.makedirs()

Как вы могли догадаться, эти два метода используются для создания папок. Первая, os.mkdir(), позволяет создать одну папку. Попробуем:

Первая строка кода создает папку под названием test в определенном каталоге. Вы можете использовать эти модули в предыдущем разделе, чтобы узнать, где именно вы запустили свой код, на случай, если вы забыли. Во втором примере мы назначили путь к переменной, затем к os.mkdir(). Это позволяет вам создать папку в любой точке вашей системы, где есть доступ. Функция os.makedirs() создает промежуточные папки в пути, если их там нет. В целом, это значит, что вы создали путь, в котором размещены папки. Лично я часто прибегал к данному решению, когда была необходимость создания журнала, с датированной структурой, например Год\Месяц\День. Давайте взглянем на пример:

Что произошло? Этот код просто создал кучу папок! Если в вашей системе все еще есть папка pytest, то в ней появится папка 2014, в которой также есть папка, в которой, удивительно, находится еще одна. Попробуйте сами, воспользовавшись рабочим путем в вашей системе.

Я правильно понимаю os.walk?

Цикл для root, dir, file в os.walk(startdir) работает через эти шаги?

получить корень из начального каталога: C: \ dir1 \ dir2 \ startdir

получить папки в C: \ dir1 \ dir2 \ startdir и вернуть список папок «dirlist»

получить файлы в первом элементе dirlist и вернуть список файлов «filelist» в качестве первого элемента списка файловых списков.

перейти ко второму элементу в dirlist и вернуть список файлов в этой папке «filelist2» как второй элемент списка файловых списков. и т.п.

перейти к следующему корню в дереве папок и начать с 2. и т. д.

Верно? Или он сначала получает все корни, затем все каталоги, а затем все файлы?

os.walk возвращает генератор, который создает кортеж значений (current_path, каталоги в current_path, файлы в current_path).

Каждый раз, когда вызывается генератор, он будет рекурсивно следовать за каждым каталогом до тех пор, пока из исходного каталога, к которому был вызван обход, не перестанут быть доступны дополнительные подкаталоги.

или если вы хотите найти файл, вы можете сделать это:

Минимальный запускаемый пример

Вот как я люблю учиться:

Это проясняет все:

  • path это корневой каталог каждого шага
  • dirnames это список базовых имен каталогов в каждом path
  • filenames список базовых имен файлов в каждом path

Проверено на Ubuntu 16.04, Python 3.5.2.

Модификация dirnames изменяет рекурсию дерева

По сути, это единственное, о чем вам нужно помнить.

Например, если вы выполните следующие операции dirnames , это повлияет на обход:

Прогулка по файлу или каталогу

Если входными данными для обхода является файл или каталог, вы можете обработать его следующим образом:

Проще говоря, os.walk () сгенерирует кортеж из путей, папок, файлов, присутствующих в заданном пути, и продолжит обход подпапок.

это сгенерирует пути ко всем подкаталогам, файлам и файлам в подкаталогах

Вот краткий пример того, как работает os.walk (), с некоторыми пояснениями с использованием нескольких функций операционной системы.

Во-первых, обратите внимание, что os.walk () возвращает три элемента: корневой каталог, список каталогов ( dirs ) непосредственно под текущим корнем и список файлов, найденных в этих каталогах. Документация даст вам больше информации.

dirs будет содержать список каталогов чуть ниже корня, а файлы будут содержать список всех файлов, найденных в этих каталогах. В следующей итерации каждый каталог из тех, что в предыдущем dirs списке, по root очереди возьмет на себя роль, и поиск будет продолжен оттуда, переходя на уровень вниз только после того, как будет выполнен поиск на текущем уровне.

Пример кода: это будет искать, подсчитывать и печатать имена .jpg и .gif файлы ниже указанного каталога поиска (вашего корня). Он также использует функцию os.path.splitext () для отделения основы файла от его расширения и функцию os.path.join (), чтобы дать вам полное имя, включая путь к найденным файлам изображений.

os.walk работает немного иначе, чем указано выше. По сути, он возвращает кортежи (путь, каталоги, файлы). Чтобы убедиться в этом, попробуйте следующее:

. вы увидите, что каждая итерация цикла будет печатать имя каталога, список имен любых каталогов непосредственно в этом каталоге и еще один список всех файлов в этом каталоге. os.walk затем войдет в каждый каталог в списке подкаталогов и будет делать то же самое, пока не будут пройдены все подкаталоги исходного корня. Возможно, вам будет полезно немного узнать о рекурсии, чтобы понять, как это работает.

Мой ответ очень простой и ясный. Я сам новичок и нашел свои ответы в Интернете (см. Особенно хорошую документацию на docs.python.org ) и попробовал какой-нибудь тестовый код, например этот:

Это распечатает дерево каталогов, где каждому каталогу — начальному каталогу и включенным подкаталогам — предшествует строка, а за ней следуют файлы, содержащиеся в ней.

Я думаю, вы должны помнить о двух вещах:

(1) os.walk генерирует 3-кортеж (тройку) <root, dirs, filenames>, где

root — строка, содержащая имя корневого каталога;

dirs — это список строк: имена каталогов, непосредственно содержащиеся в корне, то есть на первом уровне, без возможно включенных в них подкаталогов;

Имена файлов — это список строк: имена файлов, непосредственно содержащиеся в корне.

(2) цикл for, например

проходит через корневой каталог и все его подкаталоги. Это не шаг для каждого файла; он просто сканирует дерево каталогов и на каждом шаге (для каждого каталога в дереве) заполняет список имен файлов, содержащихся в нем, и список непосредственно содержащихся в нем подкаталогов. Если у вас есть n каталогов (включая корневой каталог и его подкаталоги), цикл for повторяется n раз, то есть занимает n шагов. Вы можете написать небольшой тестовый код, чтобы проверить это, например, используя счетчик. На каждом шаге он генерирует 3-кортеж: строка плюс два (возможно, пустых) списка строк. В этом примере элементы 3-кортежа называются: «корень», «подкаталоги», «файлы», но эти имена выбираете вы; если ваш код

элементы тройки будут называться «a», «b», «c».

Вернемся к тесту:

Первый цикл : root — это каталог, который вы указали во входных данных (начальный путь, начальный каталог: строка), dirs — это список имен включенных подкаталогов (но не имен включенных в них каталогов), файлы — это список включенных файлов. В тестовом коде мы не используем список dirs.

Второй цикл : root теперь является первым подкаталогом, dirs — это список подкаталогов, включенных в него , files — это список файлов, включенных в него.

. и так далее, пока не дойдете до последнего подкаталога в дереве.

Как с помощью os.walk задать поиск по всему ПК?

user avatar

Я не очень опытен в этом вопросе,но если вам нужен поиск по нескольким дискам,то попробуйте это:

и просто прописывайте эту команду дальше,лишь заменяя букву диска на нужную вам, вдруг сработает

Всё ещё ищете ответ? Посмотрите другие вопросы с метками python поиск или задайте свой вопрос.

Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345

Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *