鱼C论坛

 找回密码
 立即注册
查看: 2595|回复: 10

[已解决]遍历文件夹下的子文件夹,不继续下一级

[复制链接]
发表于 2022-6-13 14:36:31 | 显示全部楼层 |阅读模式
购买主题 本主题需向作者支付 3 鱼币 才能浏览
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-6-13 14:50:53 | 显示全部楼层
本帖最后由 jackz007 于 2022-6-13 14:54 编辑
  1. import os

  2. def search(path , file , c):
  3.     if c < 2:
  4.         try:
  5.             for each in os . listdir(path):
  6.                 x =  os . path . join(path , each)
  7.                 if os . path . isfile(x):
  8.                     if each . lower() == file . lower():
  9.                         print(x)
  10.                 elif os . path . isdir(x):
  11.                     search(x , file , c + 1)
  12.         except Exception as e:
  13.             print(e)
  14. path = input('输入初始搜索路径 : ') . strip()
  15. if path:
  16.     file = input('输入文件名 : ') . strip()
  17.     if file:
  18.         search(path , file , 0)
复制代码

        运行实况:
  1. D:\[00.Exercise]\[Python]>python x.py
  2. 输入初始搜索路径 : C:\
  3. 输入文件名 : notepad.exe
  4. [WinError 5] 拒绝访问。: 'C:\\Documents and Settings'
  5. [WinError 5] 拒绝访问。: 'C:\\Recovery'
  6. [WinError 5] 拒绝访问。: 'C:\\System Volume Information'
  7. C:\Windows\notepad.exe

  8. D:\[00.Exercise]\[Python]>
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
编程小白艾雪儿 + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-13 14:52:26 | 显示全部楼层
本主题需向作者支付 3 鱼币 才能浏览
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-13 15:24:46 | 显示全部楼层
南归 发表于 2022-6-13 14:52
本主题需向作者支付 3 鱼币 才能浏览

发错了555,应该悬赏的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-13 15:26:07 | 显示全部楼层

输入初始搜索路径是输入大的文件名,文件名是子文件吗
菜鸟表示还不太清楚qvq
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-13 15:54:51 | 显示全部楼层    本楼为最佳答案   
“想要获取fold文件夹的子文件夹,但不想获取子文件夹内的文件”
如果是想要文件夹名称可以用next()方法
  1. print(next(os.walk(fold))[1])
复制代码

如果是想要完整的文件夹路径只循环一次一可以了
  1. for root, dirs, files in os.walk(fold):
  2.     for d in dirs:
  3.         print(os.path.join(root,d))
  4.     break
复制代码

“目的是想对大文件夹里的每个小文件夹进行循环,把每个子文件夹中的图片插入word模板里”
  1. for root, dirs, files in os.walk(fold):
  2.     for file in files:
  3.         if file.split(".")[-1] in ["png","jpg"]:#加入图片格式
  4.             print(os.path.join(root,file))
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-13 17:12:54 | 显示全部楼层
本帖最后由 编程小白艾雪儿 于 2022-6-13 17:29 编辑
Lai013 发表于 2022-6-13 15:54
“想要获取fold文件夹的子文件夹,但不想获取子文件夹内的文件”
如果是想要文件夹名称可以用next()方法
...

  1. #遍历子文件夹
  2. for root, dirs, files in os.walk(fold):
  3.     for i in range(0,len(dirs)):        
  4.         
  5.         #遍历子文件夹中的图片,每个子文件夹建立一个word
  6.         for root, dirs, pics in os.walk(dirs[i]):            
  7.             for j in range(0,len(pics)):
复制代码


想请教下可以这样建立循环吗,    for i in range(0,len(dirs)):        这一行的len(dirs)好像不太对

解决啦!
  1. for root, dirs, files in os.walk(fold):
  2.     for d in dirs:
  3.         doc=Document()
  4.         doc_name = os.path.basename(d)
  5.         for root, dirs, pics in os.walk(d):
  6.             for i in range(0,len(pics)):
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-13 17:30:27 | 显示全部楼层
编程小白艾雪儿 发表于 2022-6-13 17:12
想请教下可以这样建立循环吗,    for i in range(0,len(dirs)):        这一行的len(dirs)好像不太 ...


可以
但是不能用dirs[i], dir[i]返回的是文件夹名字,不包含路径,应该改成os.path.join(root,dirs[i])

还有你这样循环套循环的不好,如果文件夹多的话你的套多少个for循环呢
os.walk()函数就可以遍历文件夹下的所有文件和文件夹了呀,不用for os.walk()后再套for  os.walk()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-13 17:49:56 | 显示全部楼层
Lai013 发表于 2022-6-13 17:30
可以
但是不能用dirs, dir返回的是文件夹名字,不包含路径,应该改成os.path.join(root,dirs)

如果读取子文件夹不再套循环的话,那就是得加条件来做吧,这是完整的代码,想求问可以怎样优化555,小白能做出来已经极限了

  1. #fold中含有子文件夹,子文件夹中含有图片,需要把各个子文件夹中的图片分别插入word
  2. from docx import Document
  3. from docx.shared import Inches
  4. import os
  5. from PIL import Image


  6. # 要插入的图片所在的文件夹
  7. fold=r"C:\\Users\liqian6\Desktop\python\digao\诚信核查"

  8. #遍历fold中的子文件夹,提取子文件夹名称作为新建word的名称(doc_name)
  9. for root, dirs, files in os.walk(fold):
  10.     for d in dirs:
  11.         doc=Document()
  12.         doc_name = os.path.basename(d)
  13.         
  14.         #遍历子文件夹中的图片,每个子文件夹建立一个word
  15.         for root, dirs, pics in os.walk(d):
  16.             for i in range(0,len(pics)):
  17.                 picpath = d+'\\'+pics[i]
  18.                 pic_name = os.path.basename(picpath)  
  19.                
  20.                 #跳过子文件夹中有PDF文件
  21.                 if (picpath.endswith('.pdf')):
  22.                     continue                     
  23.                
  24.                 try:
  25.                     #将图片的名字也插入word中
  26.                     doc.add_paragraph(pic_name)
  27.                     #插入图片
  28.                     doc.add_picture(picpath,width=Inches(6),height=Inches(4))
  29.                 except Exception:
  30.                     pic_tmp=Image.open(picpath)
  31.                     # 如果格式有问题,就用save转换成默认的jpg格式
  32.                     pic_tmp.save(pic_tmp)
  33.                     # 把处理后的图片放进Document变量doc中
  34.                     doc.add_picture(picpath, width=Inches(6),height=Inches(4))
  35.                 doc.save(doc_name+'.docx')
  36.       
  37.             #输出保存成功的标志
  38.             print(doc_name+"successfully added.")
  39.         
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-13 19:41:38 | 显示全部楼层
编程小白艾雪儿 发表于 2022-6-13 17:49
如果读取子文件夹不再套循环的话,那就是得加条件来做吧,这是完整的代码,想求问可以怎样优化555,小白 ...

能看出你对os.walk()的返回内容不是太了解
os.walk()返回的是一个三元组的生成器
第一个root是目录
第二个dirs是文件夹名称(不包含目录)
第三个files是文件名称(不包含目录)
所以
doc_name = os.path.basename(d) 完全没有必要,doc_name 和d 是一样的
picpath = d+'\\'+pics[i] 改成 picpath = os.path.join(root,pics)
程序能正确的跑起来就可以了
至于优化我觉你自己多想想,毕竟自己相处来的收获最大。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-13 19:52:04 | 显示全部楼层
Lai013 发表于 2022-6-13 19:41
能看出你对os.walk()的返回内容不是太了解
os.walk()返回的是一个三元组的生成器
第一个root是目录

嗯嗯好嘞!解释的很清楚,非常感谢啦,因为突然有需求中途学习的,确实还不深入。道阻且长,感谢道友哈哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 21:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表