开发者

使用Python检索数据库sql格式的文件

目录
  • 一、功能介绍
  • 二、制作过程
    • 1. 收集数据,明确任务
    • 2. 修改xlsx文件,生成sql数据库
    • 3. 使用Tkinter,编写检索界面
  • 三、学后总结

    我一直在探索如何让python快速地检索数据,除了把数据装在py文件里,一起打包之外,我还尝试过把数据放到json文件里或CSV文件里,这样就可以快速地检索到我们想要的数据。考虑到检索数据库sql格式的文件,我还没有做过,今天就请出DeepSeek,让它来帮我把我的数据转化为一个sql文件,然后用python生成一个tkinter框架的UI界面,结果发现查询速度飞快。以下的工具的截图。

    使用Python检索数据库sql格式的文件

    一、功能介绍

    这个工具,可以快速地读取指定的sql格式文件,找到单词的多个变形,或者输入变形来查找它的原形。其主要特别是检索速度快,图形界面,多个检索模式。采用数据库来存储文件。

    二、制作过程

    1. 收集数据,明确任务

    找到en_lemma.py格式的文件,把里面存储的数据写入到xlsx当中。文件内容如下:

    使用Python检索数据库sql格式的文件

    en_lemma.py内容

    我请DeepSeek为我生成了一段代码如下:

    from openpyxl import Workbook
    from en_lemma import lemmas  # 导入字典数据
     
    # 创建新工作簿并获取活动工作表
    wb = Workbook()
    ws = wb.active 
     
    # 遍历字典的键值对
    for key, values in lemmas.items(): 
        # 构造行数据:键作为第一列,后面接列表元素
        row_data = [key] + values
        # 将数据写入工作表
        ws.append(row_data) 
     
    # 保存Excel文件
    wb.save("lemmas_data.xlsx") 

    2. 修改xlsx文件,生成sql数据库

    我们利用Python中的pandas包和SQLite3包把这个lemmas_data.xlsx转化为sql数据库,代码如下:

    import pandas as pd
    import sqlite3
     
    # 1. 读取 Excel 文件
    excel_file = "en_lemmas.xlsx"  # Excel 文件路径
    sheet_name = "Sheet1"  # Excel 工作表名称
    df = pd.read_excel(excel_file, sheet_name=sheet_name)
     
    # 2. 创建 SQLite 数据库
    sqlite_db = "verb_forms.db"  # SQLite 数据库文件路径
    conn = sqlite3.connect(sqlite_db)
    cursor = conn.cursor()
     
    # 3. 创建表
    create_table_query = """
    CREATE TABLE IF NOT EXISTS verb_forms (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        base_form TEXT NOT NULL,
        variant TEXT NOT NULL
    );
    """
    cursor.execute(create_table_query)
     
    # 4. 将数据插入 SQLite 表
    for index, row in df.iterrows():
        base_form = row["BaseForm"]  # 假设 A 列是 BaseForm
        
        # 遍历 B、C、D 列(Variant1, Variant2, Variant3)
        for col in ["Variant1", "Variant2", "Variant3", "Variant4", "Variant5", "Variant6"]:
            variant = row[col]
            
            # 检查是否为有效值(非空)
            if pd.notna(variant) and variant.strip() != "":
                # 使用参数化查询避免 SQL 注入和特殊字符问题
                insert_query = """
                INSERT INTO verb_forms (base_form, variant)
                VALUES (?, ?);
                """
                cursor.execute(insert_query, (base_form, variant.strip()))
     
    # 5. 提交更改并关闭连接
    conn.commit()
    conn.close()
     
    print(f"数据已成功导入 SQLite 数据库: {sqlite_db}")

    代码使用前,要把lemmas_data.xlsx文件打开,在首行插入一行,为每一列增加标题。第一列为BaseForm,第二列为Variant1,第二列为Variant2,依次类推。然后再改名为en_lemmas.xlsx后,再运行上述代码。

    使用Python检索数据库sql格式的文件

    en_lemmas.xlsx文件内容

    3. 使用Tkinter,编写检索界面

    采用DeepSeek编写一个UI界面的检索软件,可视化呈现检索结果。编写前先在非可视化界面下测试软件,于时我们得到一个简单的检索代码:

    import sqlite3
     
    def get_base_form(word_to_find: str) -> str:
        try:
            # 连接数据库(自动处理相对路径)
            with sqlite3.connect("verb_forms.db")  as conn:
                cursor = conn.cursor() 
                # 参数化查询防止 SQL 注入 
                cursor.execute( 
                    "SELECT base_form FROM verb_forms WHERE variant = ?",
                    (word_to_find,)
                )
                result = cursor.fetchone() 
                return result[0] if result else ""  # 关键修复:去掉括号 
        except sqlite3.Error as e:
            print(f"数据库错误:{e}")
            return ""
     
    # 测试代码 
    if __name__ == "__main__":
        test_word = "thought"
        base_form = get_base_form(test_word)
        if base_form:
            print(f"单词 '{test_word}' 的基本形式是:{base_form}")
        else:
            print(f"未找到 '{test_word}' 的基本形式")

    然后,根据这个检索代码,进一步扩展,添加UI界面,最终得到以下代码:

    import sqlite3
    import tkinter as tk
    from tkinter import ttk
    from tkinter import messagebox
     
     
    def get_base_form(word_to_find: str) -> str:
        try:
            # 连接数据库(自动处理相对路径)
            with sqlite3.connect("verb_forms.db")  as conn:
                cursor = conn.cursor() 
                # 参数化查询防编程客栈止 SQL 注入
                cursor.execute( 
                    "SELECT base_form FROM verb_forms WHERE variant = ?",
                    (word_to_find,)
                )
                result = cursor.fetchone() 
                return result[0] if result else ""
        except sqlite3.Error as e:
            messagebox.showerror("  数据库错误", f"数据库错误:{e}")
            return ""
     
     
    def get_variants(word_to_find: str) -> list:
        try:
            with sqlite3.connect("verb_forms.db")  as conn:
                cursor = conn.cursor() 
     
                # 先验证输入的是否为有效原形
                cursor.execute("SELECT  base_form FROM verb_forms WHERE base_form = ?", (word_to_find,))
                if not cursor.fetchone(): 
                    return []  # 不是有效原形则直接返回空
     
                # 查询变形
                cursor.execute("SELECT  variant FROM verb_forms WHERE base_form = ?", (word_to_find,))
                return [row[0] for row in cursor.fetchall()] 
     
        except sqlite3.Error as e:
            messagebox.showerror("  数据库错误", f"数据库错误:{e}")
            return [编程客栈]
     
     
    def query():
        word = entry.get() 
        if choice.get()  == 1:
            base_form = get_base_form(word)
     
            if base_form:
                result_text.delete(1.0,  tk.END)
                result_text.insert(tk.END,  f"单词【{word}】的基本形式是:{base_form}")
            else:
                result_text.delete(1.0,  tk.END)
                result_text.insert(tk.END,  f"未找到【{word}】的基本形式")
        elif choice.get()  == 2:
            variants = get_variants(word)
            result_text.delete(1.0,  tk.END)
     
            if variants:
                # 显示变形列表
                result_text.insert(tk.END,  f"原形【{word}】的变形:编程客栈\n" + ", ".join(variants))
            else:
                # 分情况提示
                try:
                    with sqlite3.connect("verb_forms.db")  as conn:
                        cursor = conn.cursor() 
                        cursor.execute("SELECT  base_form FROM verb_forms WHERE variant = ?", (word,))
                        if cursor.fetchone(): 
                            result_text.insert(tk.END,  f"注意:您输入的是变形单词,请切换至「原形」模式查询")
                        else:
                            result_text.insert(tk.END,  f"数据库未收录【{word}】的相关变形")
                except sqlite3.Error as e:
                    messagebox.showerror("  数据库错误", f"数据库错误:{e}")
     
     
    def copy_text():
        result_text.clipboard_clear() 
        result_text.clipboard_append(result_text.selection_get()) 
     
     
    def cut_text():
        copy_text()
        result_text.delete(tk.SEL_FIRST,  tk.SEL_LAST)
     
     
    def paste_text():
        result_text.iwww.devze.comnsert(tk.INSERT,  result_text.clipboard_get())
        
    def entry_copy():
        try:
            # 获取 Entry 选中内容并复制 
            entry.clipboard_clear() 
            entry.clipboard_append(entry.selection_get()) 
        except tk.TclError:
            pass  # 无选中内容时不操作 
     
    def entry_cut():
        entry_copy()  # 先复制 
        try:
            entry.delete(tk.SEL_FIRST,  tk.SEL_LAST)  # 再删除选中内容 
        except tk.TclError:
            pass 
     
    def entry_paste():
        entry.insert(tk.INSERT,  entry.clipboard_get())   # 插入剪贴板内容 
     
    # 创建主窗口
    root = tk.Tk()
    root.title("  单词查询")
    # 设置所有标准控件的默认字体
    root.option_add("*Font",  ("Times New Roman", 14))  # 影响 Entry、Button 等非 ttk 控件
     
    # 设置 ttk 控件的主题字体
    style = ttk.Style()
    style.configure(".",  font=("Times New Roman", 14))  # 通配符 . 表示所有 ttk 控件
     
    # 创建输入框、单选按钮和查询按钮
    frame_top = ttk.Frame(root)
    frame_top.pack(pady=10) 
     
    entry = ttk.Entry(frame_top, width=20)
    entry.pack(side=tk.LEFT,  padx=5)
    entry.bind("<Return>",  lambda event: query())  # 按回车触发查询
    entry.focus_set()
     
    # 创建 Entry 的右键菜单 
    entry_menu = tk.Menu(entry, tearoff=0)
    entry_menu.add_command(label="  剪切", command=entry_cut)
    entry_menu.add_command(label="  复制", command=entry_copy)
    entry_menu.add_command(label="  粘贴", command=entry_paste)
     
    def show_entry_menu(event):
        entry_menu.post(event.x_root,  event.y_root)  # 显示菜单 
     
    entry.bind("<Button-3>",  show_entry_menu)  # 绑定右键事件 
     
     
    choice = tk.IntVar()
    choice.set(2) 
    radio1 = ttk.Radiobutton(frame_top, text="原形", variable=choice, value=1)
    radio1.pack(side=tk.LEFT,  padx=5)
     
    radio2 = ttk.Radiobutton(frame_top, text="变形", variable=choice, value=2)
    radio2.pack(side=tk.LEFT,  padx=5)
     
    query_button = ttk.Button(frame_top, text="查询", command=query)
    query_button.pack(side=tk.LEFT,  padx=5)
     
    # 创建结果显示文本框
    result_text = tk.Text(root, height=10, width=60)
    result_text.pack(pady=10) 
     
    # 创建右键菜单
    menu = tk.Menu(result_text, tearoff=0)
    menu.add_command(label="  复制", command=copy_text)
    menu.add_command(label="  剪切", command=cut_text)
    menu.add_command(label="  粘贴", command=paste_text)
     
    def show_menu(event):
        menu.post(event.x_root,  event.y_root)
        
    result_text.bind("<Button-3>",  show_menu)
     
    # 运行主循环
    root.mainloop() 

    在编写上述代码中,主要解决了以下几个问题:

    1)原形和变形选错时的自动调节;

    2)查询按钮绑定回车键,回车就可以实现检索;

    3)在Entry和Text的控件里都添加了右键菜单,可以非常方便地进行复制和粘贴操作。

    三、学后总结

    1. 通过Python把xlsx文件转化为sql文件,并编写可视化界面来检索这个数据库,快速得到想要的内容。

    2. Python在读取数据类型方面是其它工具无法超越的。这次我们充分发挥Python的胶水作用,sql文件检索速度快的特点,实现了一个小型语料库的快速检索。

    3. 如果我们的语料库有几十万句对,生成一个sql后再用pywww.devze.comthon检索,岂不实现了数据库检索的功能?这个问题适合我们后期继续进行探讨。

    到此这篇关于使用Python检索数据库sql格式的文件的文章就介绍到这了,更多相关Python检索sql文件内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜