python遍列目录搜索文件夹及子文件夹图片文件
自本人从事汽车配件销售工作以为,收集了很多零配件图片,超级多,每次在Window视窗搜索指定名称的图片时很耗时,超级超级的慢,实在受不了了,决定用Sqlite3将所有图片的地址存储,然后用做一个页面来搜索,这样检索够快.下面我用Python脚本写了一个检索本地目录图片路径然后存储在Sqlite3中.这个代码很简单的,我就直接贴源代码.第一次写好后,检索发现有重复的记录,仔细检查发现原来是多次遍列目录造成的,另写了一个函数修正一下就OK了,在代码中我仍然保留了先前的函数,给自己提个醒,代码中遍列目录,我用的os模块的walk方法,代码见下:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Create on 2011-10-30 10:22
@author:Arzhuo
给Nissan零配件彩图创建一个SqlLite3的数据库文件索引,用于快速搜索配件图片和显示图片
"""
import os
import shutil
import sqlite3
#本函数将数据编码转换成Unicode,目录路径或文件名有中文的,要用此函数重新编码
def u(s, encoding):
if not s:
return s
if isinstance(s, unicode):
return s
else:
return unicode(s, encoding)
""" ----begin--- 下面这两个函数停用,错在多次调用walk,导致有子目录时多次遍列,保留这两个函数是因为这两个函数也有值得借鉴的地方:
1.scanDir 这个函数里用到了回调函数.
2.SearchFile 这个函数里用到了递归该函数处理.
"""
#扫描函数,需扫描路径目录利用回调函数处理该目录所有图片地址
#此函数停用,和回调函数导致多次遍列目录,导致数据库有重复记录,此两函数暂时不用,以提配自己备忘,改写一个新的函数scanDirSearchFile
def scanDir(dir,dbname,file_callback=None):
connsqlite3 = sqlite3.connect(dbname)
cu = connsqlite3.cursor()
for root, dirs, files in os.walk(dir, True, None, False): #第一次就遍列完目录了,如果再在下层遍列就重复了
for d in dirs:
D = os.path.join(root, d)
if os.path.exists(D): #目录存在
#这个回调函数要取消了,本身就在一个遍列循环里,在回调函数里再次遍列目录,就重复遍列了,导致数据库有重复记录,要么改回调函数,要么改本函数.
# 回调函数处理 这里
if file_callback: file_callback(D,cu)
connsqlite3.commit()
#此回调函数暂时停用
#回调函数,处理指定目录下及子目录下所有图片文件
def SearchFile(dir,cu):
for root, dirs, files in os.walk(dir, True, None, False):#遍列目录
#处理该文件夹下所有文件:
for f in files:
if os.path.isfile(os.path.join(root,f)):
ext = os.path.splitext(f)[1].lower()
if ext in ('.jpg','.png','.bmp'):
#print os.path.join(root,f)
cu.execute("insert into photoaddress(photoaddress,photoname) values(?,?);",(u(os.path.join(root,f),"gbk"),u(f,"gbk"),))
pass
#下面这段取消了,这段本来就处在遍列循环内,下面无疑多此一举,多遍列目录一次,所以当有下级目录存在时有重复记录存在.
#处理文件夹下所有子目录,递规处理目录
#for d in dirs:
# D = os.path.join(root,d)
# if os.path.isdir(D):
# SearchFile(D,cu) #递归该函数处理,这里将将级目录再次遍列,第三次遍列,如果有记录那就有N条重复了,主要看目录有几层,就会出现几次重复
# pass
""" ----end--- 上面这两个函数停用 """
#重写的扫描函数,需扫描路径目录处理该目录及下级目录所有图片地址,简单明了
def scanDirSearchFile(dir,dbname):
connsqlite3 = sqlite3.connect(dbname)
cu = connsqlite3.cursor()
for root, dirs, files in os.walk(dir, True, None, False): #遍列目录
#处理该文件夹下所有文件:
for f in files:
if os.path.isfile(os.path.join(root,f)):
ext = os.path.splitext(f)[1].lower()
if ext in ('.jpg','.png','.bmp'):
#print os.path.join(root,f)
cu.execute("insert into photoaddress(photoaddress,photoname) values(?,?);",(u(os.path.join(root,f),"gbk"),u(f,"gbk"),))
pass
connsqlite3.commit()
#初始化数据库表
def CreatePhotoDB(sqliteName):
#数据库文件处理
connsqlite3 = sqlite3.connect(sqliteName)
cu = connsqlite3.cursor()
#创建表
sql = "create table IF NOT EXISTS photoaddress(photoaddress varchar(400),photoname varchar(200));"
&
补充:Web开发 , Python ,