当前位置:编程学习 > python >>

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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,