Python os.walk Включить только определенные папки
Я пишу сценарий Python, который принимает пользовательский ввод в форме даты, например 20180829, которая будет именем подкаталога, затем он использует функцию os.walk для обхода определенного каталога и, как только он достигает каталога, который передается в он будет прыгать внутрь и просматривать все каталоги внутри него и создавать структуру каталогов в другом месте.
Моя структура каталогов будет выглядеть примерно так:
|dir1
|-----|dir2|
|-----------|dir3
|-----------|20180829
|-----------|20180828
|-----------|20180827
|-----------|20180826
Таким образом, у dir3 будет несколько подпапок, которые будут в формате даты. Мне нужно иметь возможность скопировать структуру каталогов только каталога, который передается в начале, например, 20180829, и пропустить остальные каталоги.
Я искал в Интернете способ сделать это, но все, что я могу найти, это способы исключения каталогов из функции os.walk, как в приведенной ниже ветке: Фильтрация каталогов и файлов os.walk()
Я также нашел поток, который позволяет мне распечатывать пути к каталогам, которые я хочу, но не позволяет мне создавать каталоги, которые я хочу: Python 3.5 OS.Walk для выбранных папок и включения их подпапок.
Ниже приведен код, который у меня есть, который распечатывает правильную структуру каталогов, но создает всю структуру каталогов в новом месте, чего я не хочу.
includes = '20180828'
inputpath = Desktop
outputpath = Documents
for startFilePath, dirnames, filenames in os.walk(inputpath, topdown=True):
endFilePath = os.path.join(outputpath, startFilePath)
if not os.path.isdir(endFilePath):
os.mkdir(endFilePath)
for filename in filenames:
if (includes in startFilePath):
print(includes, "+++", startFilePath)
break
1 ответ
Я не уверен, что понимаю, что вам нужно, но я думаю, что вы несколько усложняете некоторые вещи. Если приведенный ниже код не поможет вам, дайте мне знать, и мы подумаем о других подходах.
Я запускаю это, чтобы создать пример, подобный вашему.
# setup example project structure
import os
import sys
PLATFORM = 'windows' if sys.platform.startswith('win') else 'linux'
DESKTOP_DIR = \
os.path.join(os.path.join(os.path.expanduser('~')), 'Desktop') \
if PLATFORM == 'linux' \
else os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop')
example_dirs = ['20180829', '20180828', '20180827', '20180826']
for _dir in example_dirs:
path = os.path.join(DESKTOP_DIR, 'dir_from', 'dir_1', 'dir_2', 'dir_3', _dir)
os.makedirs(path, exist_ok=True)
И вот что вам нужно.
# do what you want to do
dir_from = os.path.join(DESKTOP_DIR, 'dir_from')
dir_to = os.path.join(DESKTOP_DIR, 'dir_to')
target = '20180828'
for root, dirs, files in os.walk(dir_from, topdown=True):
for _dir in dirs:
if _dir == target:
path = os.path.join(root, _dir).replace(dir_from, dir_to)
os.makedirs(path, exist_ok=True)
continue