如何使用 os.walk() 循环根目录中的子目录?

问题描述 投票:0回答:1

我有一个名为“2013”的根目录,其中包含一些子目录,如下所示:

2013/:
     1/:
         ANAR/
     2/:
         ANAR/

我打算做的是使用 os.walk() 遍历最里面的子目录(即 ANAR),并在其中创建一个类似的文件夹(如果它尚不存在)。这是我的代码:

for root, dirs, files in os.walk ('./2013/'):
   for f in dirs:
     if not f.isdigit():
         path = os.path.join (root, f)
         fullpath = f'{path}{os.path.sep}{f}'
         if not os.path.isdir (fullpath):
             os.mkdir (fullpath)

但我遇到以下错误(在 ./2013/2/ANAR/ 内创建一堆 ANAR 目录):

OSError:[Errno 36]文件名太长:'./2013/2/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR /ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR /ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR/ANAR /阿纳尔/阿纳尔/ ...

关于原因有什么想法吗?

python os.walk
1个回答
1
投票

os.walk
不是您在这里需要的。您有一个固定的起始设置,并且您想要创建的所有目录都位于同一级别,因此使用这样的递归方法比所需的要复杂得多......特别是因为您确实不应该在迭代它。

你可以用

os.listdir
来做到这一点:

import os

root = '2013'

for entry in os.listdir(root):
    path = os.path.join(root, entry)
    if os.path.isdir(path):
        os.mkdir(os.path.join(path, 'ANAR', 'ANAR'))

但是您在评论中提到编号文件夹是几个月。你会永远拥有这十二个吗?如果是这样,您甚至不需要遍历目录。

import os

for month in range(1, 13):
    os.mkdir(os.path.join('2013', str(month), 'ANAR', 'ANAR'))

无论哪种情况,我都建议使用

pathlib
而不是
os
,因为它可以使你的代码更加清晰。特别是,它为您的操作系统处理正确的路径分隔符,您可以只使用正斜杠。

from pathlib import Path

for month in range(1, 13):
    Path(f'2013/{month}/ANAR/ANAR').mkdir()

或者,如果您的月份列表可能不完整并且想要迭代文件夹:

from pathlib import Path

for entry in Path('2013').iterdir():
    if entry.is_dir():
        (entry / 'ANAR/ANAR').mkdir()

(请注意,

/
运算符可以将字符串(或其他 Path 对象)连接到现有 Path 对象上。)

最后,如果其中一些

ANAR
子文件夹已经存在,这些都会抛出错误。如果可能的话,有些可能已经存在了(也许您启动了脚本但不得不中止它?),使用
Path.mkdir(exist_ok=True)
将忽略此类错误并继续创建任何 还没有 的错误。

© www.soinside.com 2019 - 2024. All rights reserved.