注册 登录
LUPA开源社区 返回首页

arzhuo的个人空间 http://www.lupaworld.com/?27776 [收藏] [复制] [分享] [RSS]

我的博客

python遍列目录搜索文件夹及子文件夹图片文件

已有 2768 次阅读2011-11-15 12:00 |个人分类:编程技术|系统分类:IT技术|

    自本人从事汽车配件销售工作以为,收集了很多零配件图片,超级多,每次在Window视窗搜索指定名称的图片时很耗时,超级超级的慢,实在受不了了,决定用Sqlite3将所有图片的地址存储,然后用做一个页面来搜索,这样检索够快.下面我用Python脚本写了一个检索本地目录图片路径然后存储在Sqlite3中.这个代码很简单的,我就直接贴源代码.第一次写好后,检索发现有重复的记录,仔细检查发现原来是多次遍列目录造成的,另写了一个函数修正一下就OK了,在代码中我仍然保留了先前的函数,给自己提个醒,代码中遍列目录,我用的os模块的walk方法,代码见下:

  1. #!/usr/bin/env python  
  2. # -*- coding: UTF-8 -*-  
  3.   
  4. """ 
  5. Create on 2011-10-30 10:22 
  6. @author:Arzhuo 
  7. 给Nissan零配件彩图创建一个SqlLite3的数据库文件索引,用于快速搜索配件图片和显示图片 
  8. """  
  9. import os  
  10. import shutil  
  11. import sqlite3  
  12.   
  13. #本函数将数据编码转换成Unicode,目录路径或文件名有中文的,要用此函数重新编码  
  14. def u(s, encoding):  
  15.     if not s:  
  16.         return s  
  17.     if isinstance(s, unicode):  
  18.         return s  
  19.     else:  
  20.         return unicode(s, encoding)  
  21.           
  22. """ ----begin---   下面这两个函数停用,错在多次调用walk,导致有子目录时多次遍列,保留这两个函数是因为这两个函数也有值得借鉴的地方: 
  23.     1.scanDir 这个函数里用到了回调函数. 
  24.     2.SearchFile 这个函数里用到了递归该函数处理. 
  25.  
  26. """  
  27. #扫描函数,需扫描路径目录利用回调函数处理该目录所有图片地址  
  28. #此函数停用,和回调函数导致多次遍列目录,导致数据库有重复记录,此两函数暂时不用,以提配自己备忘,改写一个新的函数scanDirSearchFile  
  29. def scanDir(dir,dbname,file_callback=None):  
  30.     connsqlite3 = sqlite3.connect(dbname)  
  31.     cu = connsqlite3.cursor()  
  32.     for root, dirs, files in os.walk(dir, TrueNoneFalse): #第一次就遍列完目录了,如果再在下层遍列就重复了  
  33.         for d in dirs:  
  34.             D = os.path.join(root, d)  
  35.             if os.path.exists(D):  #目录存在  
  36.                 #这个回调函数要取消了,本身就在一个遍列循环里,在回调函数里再次遍列目录,就重复遍列了,导致数据库有重复记录,要么改回调函数,要么改本函数.  
  37.                 # 回调函数处理 这里  
  38.                 if file_callback: file_callback(D,cu)  
  39.     connsqlite3.commit()  
  40.       
  41. #此回调函数暂时停用  
  42. #回调函数,处理指定目录下及子目录下所有图片文件  
  43. def SearchFile(dir,cu):  
  44.     for root, dirs, files in os.walk(dir, TrueNoneFalse):#遍列目录  
  45.         #处理该文件夹下所有文件:  
  46.         for f in files:  
  47.             if os.path.isfile(os.path.join(root,f)):  
  48.                 ext = os.path.splitext(f)[1].lower()  
  49.                 if ext in ('.jpg','.png','.bmp'):  
  50.                     #print os.path.join(root,f)  
  51.                     cu.execute("insert into photoaddress(photoaddress,photoname) values(?,?);",(u(os.path.join(root,f),"gbk"),u(f,"gbk"),))  
  52.                     pass  
  53.         #下面这段取消了,这段本来就处在遍列循环内,下面无疑多此一举,多遍列目录一次,所以当有下级目录存在时有重复记录存在.  
  54.         #处理文件夹下所有子目录,递规处理目录  
  55.         #for d in dirs:  
  56.         #    D = os.path.join(root,d)  
  57.         #    if os.path.isdir(D):  
  58.         #        SearchFile(D,cu)  #递归该函数处理,这里将将级目录再次遍列,第三次遍列,如果有记录那就有N条重复了,主要看目录有几层,就会出现几次重复  
  59.         #        pass  
  60.   
  61. """ ----end---   上面这两个函数停用  """  
  62.   
  63. #重写的扫描函数,需扫描路径目录处理该目录及下级目录所有图片地址,简单明了  
  64. def scanDirSearchFile(dir,dbname):  
  65.     connsqlite3 = sqlite3.connect(dbname)  
  66.     cu = connsqlite3.cursor()  
  67.     for root, dirs, files in os.walk(dir, TrueNoneFalse): #遍列目录  
  68.         #处理该文件夹下所有文件:  
  69.         for f in files:  
  70.             if os.path.isfile(os.path.join(root,f)):  
  71.                 ext = os.path.splitext(f)[1].lower()  
  72.                 if ext in ('.jpg','.png','.bmp'):  
  73.                     #print os.path.join(root,f)  
  74.                     cu.execute("insert into photoaddress(photoaddress,photoname) values(?,?);",(u(os.path.join(root,f),"gbk"),u(f,"gbk"),))  
  75.                     pass  
  76.     connsqlite3.commit()  
  77.       
  78.       
  79.                         
  80. #初始化数据库表  
  81. def CreatePhotoDB(sqliteName):  
  82.     #数据库文件处理  
  83.     connsqlite3 = sqlite3.connect(sqliteName)  
  84.     cu = connsqlite3.cursor()  
  85.     #创建表  
  86.     sql = "create table IF NOT EXISTS photoaddress(photoaddress varchar(400),photoname varchar(200));"  
  87.     cu.execute(sql)  
  88.     #创建图片地址索引  
  89.     sql= "create index IF NOT EXISTS photoaddress_photoaddress  on  photoaddress(photoaddress);"  
  90.     cu.execute(sql)  
  91.     #创建图片名索引  
  92.     sql= "create index IF NOT EXISTS photoaddress_photoname  on  photoaddress(photoname);"  
  93.     cu.execute(sql)  
  94.     #清空库表  
  95.     sql = "delete from photoaddress;"  
  96.     cu.execute(sql)  
  97.     connsqlite3.commit()  
  98.       
  99. if __name__ == "__main__":  
  100.     work_dir = os.path.abspath("G:/Photo/Autopart"#零配件图片放置目录  
  101.     sqliteName=os.path.join(work_dir,"autopartphoto.db"#sqlite数据库文件  
  102.     #初始化数据库表  
  103.     CreatePhotoDB(sqliteName)  
  104.     #扫描目录,刷新数据库  
  105.     #scanDir(work_dir,sqliteName,SearchFile)  #此方法停用,改用下面的函数  
  106.     scanDirSearchFile(work_dir,sqliteName)  

 有不正确的地方还望指正.     Arzhuo  2011.11.15 11 :53


评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册
验证问答 换一个 验证码 换一个

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部