鱼C论坛

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

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

[复制链接]
发表于 2022-6-13 14:36:31 | 显示全部楼层 |阅读模式
购买主题 本主题需向作者支付 3 鱼币 才能浏览
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

def search(path , file , c):
    if c < 2:
        try:
            for each in os . listdir(path):
                x =  os . path . join(path , each)
                if os . path . isfile(x):
                    if each . lower() == file . lower():
                        print(x)
                elif os . path . isdir(x):
                    search(x , file , c + 1)
        except Exception as e:
            print(e)
path = input('输入初始搜索路径 : ') . strip()
if path:
    file = input('输入文件名 : ') . strip()
    if file:
        search(path , file , 0)
        运行实况:
D:\[00.Exercise]\[Python]>python x.py
输入初始搜索路径 : C:\
输入文件名 : notepad.exe
[WinError 5] 拒绝访问。: 'C:\\Documents and Settings'
[WinError 5] 拒绝访问。: 'C:\\Recovery'
[WinError 5] 拒绝访问。: 'C:\\System Volume Information'
C:\Windows\notepad.exe

D:\[00.Exercise]\[Python]>

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-13 14:52:26 | 显示全部楼层
本主题需向作者支付 3 鱼币 才能浏览
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

发错了555,应该悬赏的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

输入初始搜索路径是输入大的文件名,文件名是子文件吗
菜鸟表示还不太清楚qvq
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-13 15:54:51 | 显示全部楼层    本楼为最佳答案   
“想要获取fold文件夹的子文件夹,但不想获取子文件夹内的文件”
如果是想要文件夹名称可以用next()方法
print(next(os.walk(fold))[1])
如果是想要完整的文件夹路径只循环一次一可以了
for root, dirs, files in os.walk(fold):
    for d in dirs:
        print(os.path.join(root,d))
    break
“目的是想对大文件夹里的每个小文件夹进行循环,把每个子文件夹中的图片插入word模板里”
for root, dirs, files in os.walk(fold):
    for file in files:
        if file.split(".")[-1] in ["png","jpg"]:#加入图片格式
            print(os.path.join(root,file))

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

#遍历子文件夹
for root, dirs, files in os.walk(fold):
    for i in range(0,len(dirs)):        
        
        #遍历子文件夹中的图片,每个子文件夹建立一个word
        for root, dirs, pics in os.walk(dirs[i]):            
            for j in range(0,len(pics)):

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

解决啦!
for root, dirs, files in os.walk(fold):
    for d in dirs:
        doc=Document()
        doc_name = os.path.basename(d)
        for root, dirs, pics in os.walk(d):
            for i in range(0,len(pics)):
想知道小甲鱼最近在做啥?请访问 -> 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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

如果读取子文件夹不再套循环的话,那就是得加条件来做吧,这是完整的代码,想求问可以怎样优化555,小白能做出来已经极限了
#fold中含有子文件夹,子文件夹中含有图片,需要把各个子文件夹中的图片分别插入word
from docx import Document
from docx.shared import Inches
import os
from PIL import Image


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

#遍历fold中的子文件夹,提取子文件夹名称作为新建word的名称(doc_name)
for root, dirs, files in os.walk(fold):
    for d in dirs:
        doc=Document()
        doc_name = os.path.basename(d)
        
        #遍历子文件夹中的图片,每个子文件夹建立一个word
        for root, dirs, pics in os.walk(d):
            for i in range(0,len(pics)):
                picpath = d+'\\'+pics[i]
                pic_name = os.path.basename(picpath)  
               
                #跳过子文件夹中有PDF文件
                if (picpath.endswith('.pdf')):
                    continue                     
                
                try:
                    #将图片的名字也插入word中
                    doc.add_paragraph(pic_name)
                    #插入图片
                    doc.add_picture(picpath,width=Inches(6),height=Inches(4))
                except Exception:
                    pic_tmp=Image.open(picpath)
                    # 如果格式有问题,就用save转换成默认的jpg格式
                    pic_tmp.save(pic_tmp)
                    # 把处理后的图片放进Document变量doc中
                    doc.add_picture(picpath, width=Inches(6),height=Inches(4)) 
                doc.save(doc_name+'.docx')
       
            #输出保存成功的标志
            print(doc_name+"successfully added.")
        
想知道小甲鱼最近在做啥?请访问 -> 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)
程序能正确的跑起来就可以了
至于优化我觉你自己多想想,毕竟自己相处来的收获最大。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯嗯好嘞!解释的很清楚,非常感谢啦,因为突然有需求中途学习的,确实还不深入。道阻且长,感谢道友哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 21:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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