自本人从事汽车配件销售工作以为,收集了很多零配件图片,超级多,每次在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

python显示文件夹图片_python遍列目录搜索文件夹及子文件夹图片文件相关推荐

  1. java 获取子文件夹_JAVA之File类 获取一个目录下的所有文件夹和文件,包括子文件夹和子文件...

    package ioTest.io3; import java.io.File; /* * 获取一个目录下的所有文件夹和文件,包括子文件夹和子文件 . * 并将文件夹和文件名称打印在控制台上面.并且要 ...

  2. Linux C 读取文件夹下所有文件(包括子文件夹)

    Linux C 读取文件夹下所有文件(包括子文件夹) 递归读取某文件夹及其子文件夹下所有文件名 深入探讨:linux中遍历文件夹下的所有文件 Linux C :遍历输出指定目录下的所有文件 Linux ...

  3. 复制文件夹下所有文件(包括子文件夹),到一个文件夹

    把子目录文件复制到当前目录 读取文件夹下所有文件路经,包括子文件夹下 import PIL.Image as Image import os import shutil def list_folder ...

  4. Linux C 读取文件夹下所有文件(包括子文件夹)的文件名

    本文:http://www.cnblogs.com/xudong-bupt/p/3504442.html Linux C  下面读取文件夹要用到结构体struct dirent,在头#include ...

  5. linux 更改文件权限(子文件夹)

    加入-R 参数,就可以将读写权限传递给子文件夹 例如 chmod -R 777 /home/mypackage 那么mypackage 文件夹和它下面的所有子文件夹的属性都变成了777. 777是读. ...

  6. 获取文件夹下的文件,包含子文件夹并复制文件

    工作的时候用到的一些方法,在这里记录一下. public class GetFileList {private static ArrayList<File> fileList = new ...

  7. python 包 子文件夹调用_15步,你就能拥有自己的Python程序包

    每个软件开发员和数据科学家都难免要做程序包.本文推荐一篇Python开源程序包的制作指南,希望这个包含了具体操作步骤的指南能让你在构建程序包时不用花那么多耐心和时间.(适用于macOS系统的Pytho ...

  8. 遍历文件夹(含子文件夹)方法

    做法基本上有2大类: ① 经典Dir ② FSO 即 Scripting. File System Object 的[文件系统对象]脚本方法. 一开始可能Dir方法较为普遍,但随着水平的提高,应用FS ...

  9. python相对路径找不到文件_Python相对路径从子文件夹导入

    首先发布到SO,所以如果我错过了一些细节,请原谅我. 有没有办法使用来自另一个子文件夹的相对路径而不需要通过os修改sys.path?最终这将从cgi网络服务器运行,所以我宁愿远离python.exe ...

最新文章

  1. 今晚20:00 | 港科大郑光廷院士详解人工视觉技术发展及应用
  2. Dubbo基础专题——第一章(带你认识Dubbo)
  3. 某大龄程序员哀叹:夫妻双失业后还不起房贷,被迫断供!四年还了80万,60多万都是利息!...
  4. 更改as的默认gradle地址_面试官:谈谈这4种磁盘IO调度算法--CFQ、NOOP、Deadline、AS...
  5. 使用Shell(bash) 来检查 git 本地某个分支是否存在
  6. C# 线程池和编程实例
  7. APACHE TOMCAT INTERVIEW QUESTIONS ANSWERS【转】
  8. rf中resourceid_解决VC++ MFC程序resource.h头文件中ID重复问题
  9. AD制图相关问题总结
  10. 异步编程模型(C#5.0系列)
  11. oracle 查看白名单,oracle配置访问白名单教程
  12. ISP芯片架构及算法初理解
  13. 可口可乐市场调查失败的原因_经典案例可口可乐一次市场调研失败的教训
  14. 如何开好项目启动大会
  15. 论文阅读——TR-GAN: Topology Ranking GAN with Triplet Loss for Retinal Artery/Vein Classification
  16. Mysql出现问题:ERROR 2058: Plugin caching_sha2_passward could not be loaded解决方案
  17. 嵌入式C语言实例(达内2013)
  18. Windows系统下CMD命令行切换目录文件
  19. 使用SciTE4AHK编辑本脚本【ahk】
  20. [源码解析] 深度学习分布式训练框架 horovod (10) --- run on spark

热门文章

  1. c#取消word修订痕迹_法律人必备的WORD技能,从1.0到2.0丨星瀚技术派
  2. Python 的一些日常高频写法总结!
  3. Centos 更换静态IP脚本
  4. 利用串口对 89S 系列单片机编程
  5. html5支持.9.png,javascript-当Alpha透明时,HTML5 Canvas转换为PNG会将所有通道归零
  6. 面试十五年经验程序员,面试官沦为听众
  7. android studio 读取网络图片
  8. 个人主页增添超级玛丽小游戏与留言板功能
  9. 用传感器建立地球中枢神经系统可预警天灾
  10. RMQPOJ3264