【问题标题】:How to loop over sub-directories within a root directory using os.walk()?如何使用 os.walk() 遍历根目录中的子目录?
【发布时间】:2021-04-02 21:46:00
【问题描述】:

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

关于原因的任何想法?

【问题讨论】:

  • 尝试改用pathlib,更好的实现[docs.python.org/3/library/pathlib.html]
  • 在遍历子目录时不要创建子目录。
  • 您能否准确说明您正在寻找的最终状态是什么,以及您的初始结构如何变化?例如,您是否只想在根目录下创建恰好两个级别的子目录,或者某些目录可以嵌套更多?每个不是数字且不包含在同名文件夹中的文件夹是否都应该包含同名的子文件夹?
  • @CrazyChucky 初始结构很严格,没有变化(年/月/站/)。是的,我要构建的目录恰好位于根目录下 2 级的每个子目录中,不再需要嵌套目录。一行子目录的当前状态是./2013/1/ANAR,我想使它成为./2013/1/ANAR/ANAR

标签: python os.walk


【解决方案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,因为它可以使用make your code a lot clearer。特别是,它为您的操作系统处理正确的路径分隔符,您可以只使用正斜杠。

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) 将忽略此类错误并继续创建任何不存在的错误。

【讨论】:

  • 感谢您的建议。它们都很有用
猜你喜欢
  • 2013-06-01
  • 2023-01-09
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多