Python os.walk 仅包括特定文件夹
Python os.walk Include only specific folders
我正在编写一个 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
我不确定我是否理解你的需要,但我认为你把一些事情复杂化了。如果下面的代码对您没有帮助,请告诉我,我们会考虑其他方法。
我运行创建一个像你这样的例子。
# 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
我正在编写一个 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
我不确定我是否理解你的需要,但我认为你把一些事情复杂化了。如果下面的代码对您没有帮助,请告诉我,我们会考虑其他方法。
我运行创建一个像你这样的例子。
# 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