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:\\> 本主题需向作者支付 3 鱼币 才能浏览 南归 发表于 2022-6-13 14:52
本主题需向作者支付 3 鱼币 才能浏览
发错了555,应该悬赏的 jackz007 发表于 2022-6-13 14:50
运行实况:
输入初始搜索路径是输入大的文件名,文件名是子文件吗
菜鸟表示还不太清楚qvq “想要获取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: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)): 编程小白艾雪儿 发表于 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() 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.")
编程小白艾雪儿 发表于 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)
程序能正确的跑起来就可以了
至于优化我觉你自己多想想,毕竟自己相处来的收获最大。 Lai013 发表于 2022-6-13 19:41
能看出你对os.walk()的返回内容不是太了解
os.walk()返回的是一个三元组的生成器
第一个root是目录
嗯嗯好嘞!解释的很清楚,非常感谢啦,因为突然有需求中途学习的,确实还不深入。道阻且长,感谢道友哈哈哈
页:
[1]