python - 如何使用 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/阿纳/阿纳/ ...
关于原因的任何想法?
解决方案
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
over 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 对象)连接到现有的 Pat 对象上。)
ANAR
最后,如果其中一些子文件夹已经存在,它们都会抛出错误。如果可能有一些可能已经存在(也许您启动了脚本但不得不中止它?), usingPath.mkdir(exist_ok=True)
将忽略此类错误并继续创建任何尚不存在的错误。
推荐阅读
- google-sheets - 如何自动格式化数据以在 Google 表格中创建树状图?
- c# - 如何在执行下一个方法之前强制结果?
- python - 有效计算数千个坐标对之间的距离
- login - 如何修复 Joomla(版本 > 3.6)管理员重定向回登录页面?
- python - 您如何记录拉伸 FITS 图像并更改其对比度?
- ios - 为邀请创建操作
- javascript - 将类添加到插槽范围
- sas - 如何在 SAS 程序中执行 Teradata 存储过程?
- visual-studio-code - VSCode Prettier 扩展 vs 命令行 Prettier
- angular - 摆脱外部嵌套的可观察打字稿