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));"

cu.execute(sql)

#创建图片地址索引

sql= "create index IF NOT EXISTS photoaddress_photoaddress on photoaddress(photoaddress);"

cu.execute(sql)

#创建图片名索引

sql= "create index IF NOT EXISTS photoaddress_photoname on photoaddress(photoname);"

cu.execute(sql)

#清空库表

sql = "delete from photoaddress;"

cu.execute(sql)

connsqlite3.commit()

if __name__ == "__main__":

work_dir = os.path.abspath("G:/Photo/Autopart") #零配件图片放置目录

sqliteName=os.path.join(work_dir,"autopartphoto.db") #sqlite数据库文件

#初始化数据库表

CreatePhotoDB(sqliteName)

#扫描目录,刷新数据库

#scanDir(work_dir,sqliteName,SearchFile) #此方法停用,改用下面的函数

scanDirSearchFile(work_dir,sqliteName)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值