编程小白艾雪儿 发表于 2022-6-13 14:36:31

本主题需向作者支付 3 鱼币 才能浏览 购买主题

jackz007 发表于 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:\\>python x.py
输入初始搜索路径 : C:\
输入文件名 : notepad.exe
拒绝访问。: 'C:\\Documents and Settings'
拒绝访问。: 'C:\\Recovery'
拒绝访问。: 'C:\\System Volume Information'
C:\Windows\notepad.exe

D:\\>

南归 发表于 2022-6-13 14:52:26

本主题需向作者支付 3 鱼币 才能浏览

编程小白艾雪儿 发表于 2022-6-13 15:24:46

南归 发表于 2022-6-13 14:52
本主题需向作者支付 3 鱼币 才能浏览

发错了555,应该悬赏的

编程小白艾雪儿 发表于 2022-6-13 15:26:07

jackz007 发表于 2022-6-13 14:50
运行实况:

输入初始搜索路径是输入大的文件名,文件名是子文件吗
菜鸟表示还不太清楚qvq

Lai013 发表于 2022-6-13 15:54:51

“想要获取fold文件夹的子文件夹,但不想获取子文件夹内的文件”
如果是想要文件夹名称可以用next()方法
print(next(os.walk(fold)))
如果是想要完整的文件夹路径只循环一次一可以了
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))

编程小白艾雪儿 发表于 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):            
            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)):

Lai013 发表于 2022-6-13 17:30:27

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


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

还有你这样循环套循环的不好,如果文件夹多的话你的套多少个for循环呢
os.walk()函数就可以遍历文件夹下的所有文件和文件夹了呀,不用for os.walk()后再套foros.walk()

编程小白艾雪儿 发表于 2022-6-13 17:49:56

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



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

#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
                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.")
      

Lai013 发表于 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 改成 picpath = os.path.join(root,pics)
程序能正确的跑起来就可以了
至于优化我觉你自己多想想,毕竟自己相处来的收获最大。

编程小白艾雪儿 发表于 2022-6-13 19:52:04

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


嗯嗯好嘞!解释的很清楚,非常感谢啦,因为突然有需求中途学习的,确实还不深入。道阻且长,感谢道友哈哈哈
页: [1]
查看完整版本: 遍历文件夹下的子文件夹,不继续下一级