python编程:SQLite 管理图片数据库

在本博客中,我们将介绍如何使用 wxPython 和 sqlite3 模块构建一个 GUI 应用程序,该程序可以遍历指定文件夹中的所有图片,并将其信息存储到 SQLite 数据库中。
C:\pythoncode\new\InputImageOFFolderTOSqlite.py

项目简介

我们的目标是创建一个程序,该程序能够从用户指定的文件夹中读取图片文件,并将图片的以下信息存储到 SQLite 数据库的 pics 表中:

  • 图片数据(BLOB)
  • 图片文件名
  • 图片完整路径
  • 图片的最后修改日期
  • 图片的 MD5 码
环境设置

在开始编写代码之前,确保你已安装 wxPython 和 SQLite3 模块。可以使用以下命令安装 wxPython:

pip install wxPython
代码实现

以下是实现上述功能的完整 Python 程序:

import wx
import os
import sqlite3
import hashlib
from datetime import datetime

class SQLiteImageImporter(wx.Frame):
    def __init__(self, parent, title):
        super(SQLiteImageImporter, self).__init__(parent, title=title, size=(500, 300))

        self.panel = wx.Panel(self)
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        
        # Directory Selection
        hbox1 = wx.BoxSizer(wx.HORIZONTAL)
        self.dir_path_text = wx.TextCtrl(self.panel)
        dir_path_btn = wx.Button(self.panel, label='Select Directory')
        dir_path_btn.Bind(wx.EVT_BUTTON, self.on_select_directory)
        hbox1.Add(self.dir_path_text, proportion=1, flag=wx.EXPAND|wx.ALL, border=5)
        hbox1.Add(dir_path_btn, flag=wx.ALL, border=5)
        
        # Import Button
        import_btn = wx.Button(self.panel, label='Import Images')
        import_btn.Bind(wx.EVT_BUTTON, self.on_import_images)
        
        vbox.Add(hbox1, flag=wx.EXPAND)
        vbox.Add(import_btn, flag=wx.ALL|wx.CENTER, border=10)
        
        self.panel.SetSizer(vbox)
        
        self.Centre()
        self.Show()
    
    def on_select_directory(self, event):
        with wx.DirDialog(self, "Choose directory with images", "", wx.DD_DEFAULT_STYLE) as dirDialog:
            if dirDialog.ShowModal() == wx.ID_OK:
                self.dir_path_text.SetValue(dirDialog.GetPath())
    
    def on_import_images(self, event):
        dir_path = self.dir_path_text.GetValue()
        
        if not dir_path:
            wx.MessageBox('Directory path is required', 'Error', wx.OK | wx.ICON_ERROR)
            return
        
        db_path = "C:\\pythoncode\\new\\data\\picbase.db"
        
        conn = sqlite3.connect(db_path)
        cursor = conn.cursor()
        
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS pics (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                pic BLOB,
                picname TEXT,
                picpath TEXT,
                picdate TEXT,
                picmd5 TEXT
            )
        ''')
        
        for root, _, files in os.walk(dir_path):
            for filename in files:
                file_path = os.path.join(root, filename)
                if os.path.isfile(file_path) and file_path.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
                    with open(file_path, 'rb') as f:
                        pic_data = f.read()
                    
                    picname = filename
                    picpath = file_path
                    picdate = datetime.fromtimestamp(os.path.getmtime(file_path)).strftime('%Y-%m-%d %H:%M:%S')
                    picmd5 = hashlib.md5(pic_data).hexdigest()
                    
                    cursor.execute('''
                        INSERT INTO pics (pic, picname, picpath, picdate, picmd5)
                        VALUES (?, ?, ?, ?, ?)
                    ''', (pic_data, picname, picpath, picdate, picmd5))
        
        conn.commit()
        conn.close()
        
        wx.MessageBox('Images imported successfully', 'Success', wx.OK | wx.ICON_INFORMATION)

if __name__ == '__main__':
    app = wx.App(False)
    frame = SQLiteImageImporter(None, "SQLite Image Importer")
    app.MainLoop()
代码解释
  1. 选择目录:用户可以通过点击“Select Directory”按钮选择包含图片的文件夹。
  2. 导入图片:点击“Import Images”按钮将所选文件夹及其子文件夹中的所有图片文件导入到数据库中。
  3. 数据库结构:数据库表 pics 包含以下字段:
    • pic: 图片数据(BLOB)
    • picname: 图片文件名
    • picpath: 图片完整路径
    • picdate: 图片文件的最后修改日期
    • picmd5: 图片文件的 MD5 码
使用步骤
  1. 运行程序后,首先选择包含图片的文件夹。
  2. 点击“Import Images”按钮,将图片文件导入到数据库中。
  3. 程序会在指定路径 C:\pythoncode\new\data\picbase.db 创建或更新数据库并插入图片信息。
结果如下:

在这里插入图片描述
在这里插入图片描述

结语

通过这个简单的 GUI 应用程序,用户可以方便地将指定文件夹及其子文件夹中的所有图片信息批量导入到 SQLite 数据库中。该程序实现了基本的数据库操作和文件处理功能,是一个不错的学习和实践例子。希望本文能对你有所帮助!如果有任何问题或建议,欢迎留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/667594.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新版校园跑腿外卖独立版+APP+小程序前端外卖配送平台源码

同城校园跑腿外卖配送平台源码,这套目前全网还没有人分享过,这个是开源的,所以没有任何问题了,这套源码非常吊,支持自定义diy 你可以设计你的页面,设计你自己的风格,支持多校园,独立…

Java基础入门day62

day62 AJAX 概念 AJAX: Asynchronous Javascript And XML AJAX是一种无需重新加载整个网页的情况下,能够更新部分网页的技术 AJAX是一种用于创建快速动态网页的技术 通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新 传统…

Jvm(二)新生代和老年代与GC回收

目录 新生代和老年代 新生代 MinorGC 老年代(Old Generation) MajorGC Minor GC、Major GC 和 Full GC 三个GC具体区别和使用场景 JVM GC及内存调优的参数 调优建议 前言-与正文无关 ​ 生活远不止眼前的苦劳与奔波,它还充满了无…

【教程】自监督 对比学习,代码,爽学一波

from: https://docs.lightly.ai/self-supervised-learning/examples/simclr.html

1114 全素日

你好哇&#xff0c;新的一天开始啦&#xff01; solution 取数值的不同部分&#xff0c;联想到借助string #include<iostream> #include<string> using namespace std; bool judge(string s){int n atoi(s.c_str());if(n 1 || n 0) return false;for(int i 2…

基于51单片机的超声波测距—数码管显示

基于51单片机的超声波测距 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.HC-SR04模块测量距离&#xff0c;LED数码管显示距离&#xff1b; 2.测量范围&#xff1a;2cm-400cm&…

深度学习中的模型架构详解:RNN、LSTM、TextCNN和Transformer

深度学习中的模型架构详解&#xff1a;RNN、LSTM、TextCNN和Transformer 文章目录 深度学习中的模型架构详解&#xff1a;RNN、LSTM、TextCNN和Transformer循环神经网络 (RNN)RNN的优点RNN的缺点RNN的代码实现 长短期记忆网络 (LSTM)LSTM的优点LSTM的缺点LSTM的代码实现 TextCN…

[每周一更]-(第99期):MySQL的索引为什么用B+树?

文章目录 B树与B树的基本概念B树&#xff08;Balanced Tree&#xff09;B树&#xff08;B-Plus Tree&#xff09;对比 为什么MySQL选择B树1. **磁盘I/O效率**2. **更稳定的查询性能**3. **更高的空间利用率**4. **并发控制** 其他树结构的比较参考 索引是一种 数据结构&#x…

文件夹损坏0字节:全面解析、恢复技巧与预防策略

在数字时代&#xff0c;数据的完整性和安全性至关重要。然而&#xff0c;我们时常会遭遇文件夹损坏并显示为0字节的棘手问题。这种情况一旦发生&#xff0c;用户可能会面临数据丢失的风险。本文将详细探讨文件夹损坏0字节的现象&#xff0c;分析其背后的原因&#xff0c;并提供…

Java对象的比较——equals方法,Comparable接口,Comparator接口

Java对象的比较——equals方法&#xff0c;Comparable接口&#xff0c;Comparator接口 1. equals方法2. Comparable接口3. Comparator接口 1. equals方法 在判断两个整数是否相同时&#xff0c;我们可以使用以下方式&#xff1a; System.out.println(1 2); System.out.printl…

【传知代码】基于知识引导提示的因果概念提取(论文复现)

前言&#xff1a;在当今信息爆炸的时代&#xff0c;我们被海量的数据所包围&#xff0c;然而&#xff0c;这些数据中的真正价值往往隐藏在深层的因果关系之中。无论是科学研究、商业决策&#xff0c;还是日常生活中的选择&#xff0c;理解并准确把握事物之间的因果关系&#xf…

Nginx 文件下载 限速设置 限制访问频率 下载速率 并发连接数 简单实用教程

1 没有限速之前 2 nginx配置 #增加如下配置 limit_conn_zone $binary_remote_addr zoneaddr:10m; location / {limit_conn addr 1; #按照来源&#xff0c;限制每个IP 的连接数为1limit_rate_after 1000k;不限速下载的数据量limit_rate 100k; #限制最大传输速率root /data/log…

Lesson6--排序(初级数据结构完结篇)

【本节目标】 1. 排序的概念及其运用 2. 常见排序算法的实现 3. 排序算法复杂度及稳定性分析 1.排序的概念及其运用 1.1排序的概念 排序 &#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来…

随身wifi和手机流量卡,你知道该怎么选吗?

网络已经成为我们这个时代的代名词&#xff01; 那么&#xff0c;在上网的时代&#xff0c;我们有很多问题都要考虑&#xff0c;比如如何选择上网方式&#xff0c;是选择一张流量卡&#xff0c;还是一个随身WIFI&#xff1f; 听小编一句劝&#xff0c;先不要着急买&#xff0c…

2024年中国CRM行业发展方向和前景 | 《连接型CRM》文章精选

01、创新突破&#xff0c;技术为本 中国经济发展处于增速换挡期&#xff0c;企业数字化需求旺盛&#xff0c;同时云计算、大数据、物联网、区块链、5G等新技术的发展&#xff0c;为CRM系统的应用与发展提供了更多的机遇和可能。 近些年来&#xff0c;技术的发展对CRM的重要性…

打造你的专属Vue组件:超实用“高级筛选弹窗组件“实战

打造你的专属Vue组件&#xff1a;超实用“高级筛选弹窗组件“实战 在现代前端开发中&#xff0c;组件化思想是提高开发效率、维护性和代码复用性的关键。本文将通过一个实例——创建一个自定义的“高级筛选”弹窗组件&#xff0c;来展示如何在Vue框架下利用Composition API和E…

AI图书推荐:使用GPT-4和ChatGPT开发AI应用APP

这本书是面向想要学习如何使用大型语言模型构建应用程序的 Python 开发人员的全面指南。作者 Olivier Caelen 和 Marie-Alice Blete 涵盖了 GPT-4 和 ChatGPT 的主要特征和好处&#xff0c;并解释了它们的工作原理。您还将获得使用 GPT-4 和 ChatGPT Python 库开发应用程序的逐…

解决3D模型变黑及贴图不显示的问题---模大狮模型网

在3D建模和渲染过程中&#xff0c;模型变黑或贴图不显示是常见的挑战之一。这不仅影响了模型的视觉效果&#xff0c;还可能导致后续的工作流程受阻。本文将针对这两个问题&#xff0c;提供详细的解决方法和步骤&#xff0c;帮助读者快速有效地解决问题。 一、检查并调整光照设置…

【SpringBoot】怎么在一个大的SpringBoot项目中创建多个小的SpringBoot项目,从而形成子父依赖

父子项目工程创建 步骤 先创建父项目 具体操作步骤请看本文章&#xff1a;使用maven工程创建spring boot项目 创建子项目 file- project structure module–new module 剩下步骤请看创建父工程时的操作使用maven工程创建spring boot项目 应用 确认即可 之后创建启动类…

【实战JVM】-实战篇-05-内存泄漏及分析

【实战JVM】-实战篇-05-内存泄漏及分析 1 内存溢出和内存泄漏1.1 常见场景1.2 解决内存溢出的方法1.2.1 发现问题1.2.1.1 top1.2.1.2 ViusalVM1.2.1.3 arthas1.2.1.4 PrometheusGrafana 1.2.2 堆内存状况对比1.2.3 内存泄漏原因-代码中1.2.3.1 equals()-hashCode()1.2.3.2 内部…