在Python中的特定子文件夹中创建多个子文件夹

在Python中的特定子文件夹中创建多个子文件夹,python,operating-system,Python,Operating System,如果我有一个文件夹test,它有多个子文件夹a,B,C,等等,每个文件夹都有相同的结构sub1,sub2和sub3: ├─A │ ├─sub1 │ ├─sub2 │ └─sub3 ├─B │ ├─sub1 │ ├─sub2 │ └─sub3 └─C | ├─sub1 | ├─sub2 | └─sub3 ... 我只想在sub1和sub2中创建名为a和b的子文件夹,并忽略其他子文件夹(sub3…)。这是预期的结果: ├─A │ ├─sub1|--a │ | |

如果我有一个文件夹
test
,它有多个子文件夹
a
B
C
,等等,每个文件夹都有相同的结构
sub1
sub2
sub3

├─A
│  ├─sub1
│  ├─sub2
│  └─sub3
├─B
│  ├─sub1
│  ├─sub2
│  └─sub3
└─C
|   ├─sub1
|   ├─sub2
|   └─sub3
...
我只想在
sub1
sub2
中创建名为
a
b
的子文件夹,并忽略其他子文件夹(
sub3…
)。这是预期的结果:

├─A
│  ├─sub1|--a
│  |     |--b
│  ├─sub2|--a
│  |     |--b
│  └─sub3
├─B
│  ├─sub1|--a
│  |     |--b
│  ├─sub2|--a
│  |     |--b
│  └─sub3
└─C
│  ├─sub1|--a
│  |     |--b
│  ├─sub2|--a
│  |     |--b
   └─sub3
...
我可以用下面的代码创建文件夹
a
b
,但我不知道如何才能这样做
sub1
sub2
?谢谢

import os

root_path =r"D:\test"
sub_folders = ['a', 'b']
folders = []
for path in os.listdir(root_path):
   folders.append(os.path.join(root_path, path))

for f in folders:
    os.chdir(f)
    for sub_folder in sub_folders:
        os.mkdir(sub_folder)
更新:下面的代码不会创建子文件夹
a
b

sub_folders = ['a', 'b']
folders = []

for path in os.listdir(root_path):
    if path in ('sub1', 'sub2'):
        folders.append(os.path.join(root_path, path))

for f in folders:
    os.chdir(f)
    for sub_folder in sub_folders:
        os.mkdir(sub_folder)
更新:感谢@Baltschun Ali,下面的代码可以正常工作

import os

path = 'C:/Users/User/Desktop/test1'
def create_sub_folder (*arg):
    if len(arg) < 3:
        for i in arg[0]:
            for j in arg[1]:
                path = i+"/"+j
                if os.path.exists(path) is False:
                    os.makedirs(path)
    else:      
        arg1 = [i+"/"+j for i in arg[0] for j in arg[1]]
        create_sub_folder(arg1,*(i for i in arg[2:]))

for dir in os.listdir(path):
    if os.path.isdir(os.path.join(path, dir)):
        print(dir)
        create_sub_folder([dir], ['sub1', 'sub2'],['a','b'])
导入操作系统
路径='C:/Users/User/Desktop/test1'
def创建子文件夹(*arg):
如果len(arg)<3:
对于arg[0]中的i:
对于arg[1]中的j:
路径=i+“/”+j
如果os.path.exists(path)为False:
os.makedirs(路径)
其他:
arg1=[i+“/”+j代表arg中的i[0]代表arg[1]中的j]
创建子文件夹(arg1,*(arg[2:])
对于os.listdir(路径)中的目录:
如果os.path.isdir(os.path.join(path,dir)):
打印(目录)
创建子文件夹([dir]、'sub1'、'sub2']、['a'、'b'])

您可以在第一个
for
循环中使用
if
语句,以避免仅当路径是
sub1
sub2
之一时才将其添加到列表中:

for path in os.listdir(root_path):
   if path in ('sub1', 'sub2'):
       folders.append(os.path.join(root_path, path))

您可以使用
glob
库:

import glob, os

for new_dir_name in ('a','b'):
    for subn in ('sub1', 'sub2'):
        for sub_folder in glob.glob(os.path.join('*',subn), recursive=True):
            os.mkdir(os.path.join(sub_folder, new_dir_name))
在Linux中测试:

$ mkdir -p {A,B}/sub1 {A,B,C}/sub2 
$ python make_sub_dirs.py # run the python script above
$ ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
结果:

   |-A
   |---sub1
   |-----a
   |-----b
   |---sub2
   |-----a
   |-----b
   |-B
   |---sub1
   |-----a
   |-----b
   |---sub2
   |-----a
   |-----b
   |-C
   |---sub2
   |-----a
   |-----b
   |-ipp2
   |---log
更具活力

编辑的代码

def create_sub_folder (*arg):
    if len(arg) < 3:
        for i in arg[0]:
            for j in arg[1]:
                path = i+"/"+j
                if os.path.exists(path) is False:
                    os.makedirs(path)
    else:      
        arg1 = [i+"/"+j for i in arg[0] for j in arg[1]]
        create_sub_folder(arg1,*(i for i in arg[2:]))
结果:

以前

之后

您可以传递3级以上的子文件夹 只需在arg中传递更多数组

create_sub_folder([],[],[],[],[],[],['a','b'])

感谢您的帮助,但我希望为
sub1
sub2
创建
a
b
。很抱歉,我忽略了这一点。我想也许我们应该使用
os.walk
,不行?@ahbon那也行。但是
glob
具有很好的“通配符”扩展功能,因此我们不需要在代码中处理路径模式匹配。我尝试了你的方法,它没有创建
a
b
,你成功创建文件夹了吗?谢谢,我替换了你的代码,但没有成功。请查看我的问题更新。谢谢你的帮助。对不起,也许我不清楚,事实上我已经有了一个文件夹结构(不需要创建
“D:\test”
,但是你的代码对创建测试数据很有用),我只想在
sub1
sub2
下创建子文件夹
a
,而不是sub1--a、sub1--b或sub2--a、sub2--b。对不起,我错过了你的第一个问题(编辑前)谢谢,有没有办法避免列出
['a','B']
,因为我在真实数据中有这一级别的文件夹?你的意思是,向所有父文件夹添加一个子文件夹?只需使用
glob
获取所有父文件夹,并将其传递到arg
的第一个数组中创建子文件夹(array\u folder\u from\u glob,['sub1'、'sub2']、['a'、'b'])
create_sub_folder([],[],[],[],[],[],['a','b'])