Python os.walk仅包含特定文件夹

时间:2018-08-30 12:53:46

标签: python recursion os.walk

我正在编写一个Python脚本,该脚本接受日期形式的用户输入,例如20180829,这将是一个子目录名称,然后它使用os.walk函数遍历特定目录,一旦到达该目录传递给它,它将跳入内部并查看其中的所有目录,并在其他位置创建目录结构。

我的目录结构如下所示:

|dir1

|-----|dir2|

|-----------|dir3

|-----------|20180829

|-----------|20180828

|-----------|20180827

|-----------|20180826

因此dir3将具有许多子文件夹,所有子文件夹均采用日期格式。我需要能够仅复制在开始时传入的目录的目录结构,例如20180829,并跳过目录的其余部分。

我一直在网上寻找一种方法来执行此操作,但是我只能找到从os.walk函数中排除目录的方法,如下面的线程所示: Filtering os.walk() dirs and files

我还找到了一个线程,该线程允许我打印出所需的目录路径,但不允许我创建所需的目录: Python 3.5 OS.Walk for selected folders and include their subfolders

以下是我拥有的代码,该代码可以打印出正确的目录结构,但正在我不希望其执行的新位置中创建整个目录结构。

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 个答案:

答案 0 :(得分:0)

我不确定我是否了解您的需求,但是我认为您使某些事情变得过于复杂。如果以下代码对您没有帮助,请告诉我,我们将考虑其他方法。

我运行它来创建一个像您一样的示例。

# 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