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
Другие вопросы по тегам