微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用 os.walk() 遍历根目录中的子目录?

我有一个名为“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/ANAR/ANAR/ ...

关于原因的任何想法?

解决方法

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'))

无论哪种情况,我都建议使用 enter image description here 而不是 os,因为它可以 pathlib。特别是,它为您的操作系统处理正确的路径分隔符,您可以只使用正斜杠。

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 对象)连接到现有的 Pat 对象上。)

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。