使用 SQL 和表格数据进行问答和 RAG(6)—将指定目录下的 CSV 或 Excel 文件导入 SQLite 数据库

news2025/1/9 20:12:58

将指定目录下的 CSV 或 Excel 文件导入 SQLite 数据库。以下是详细代码逻辑:


1. 类结构

该类包含三个主要方法:

  • _prepare_db:负责将文件夹中的 CSV 和 XLSX 文件转换为 SQL 表。
  • _validate_db:用于验证 SQL 数据库中创建的表是否成功。
  • run_pipeline:主方法,按顺序调用 _prepare_db_validate_db 方法完成整个数据导入流程。

2. 构造方法 __init__

def __init__(self, files_dir) -> None:

作用

  • 初始化类的实例,设置必要的变量,如数据文件目录和数据库路径。
  • 从配置文件中加载数据库路径。

参数

  • files_dir:指定包含数据文件(CSV/XLSX)的目录。

执行流程

  1. 通过 LoadConfig 加载配置(如数据库存储路径)。
  2. 列出指定目录下的所有文件并存储到 self.file_dir_list
  3. 使用 SQLAlchemycreate_engine 方法初始化 SQLite 数据库连接。

3. 私有方法 _prepare_db

def _prepare_db(self):

作用

  • 遍历指定目录中的所有文件,将 CSV 和 XLSX 文件转换为 Pandas DataFrame,然后保存到 SQLite 数据库中。

执行流程

  1. 遍历目录中的文件:
    • 判断文件扩展名,读取 CSV 或 XLSX 文件到 DataFrame。
    • 如果文件不是 .csv.xlsx,抛出 ValueError
  2. 检查 SQL 数据库中是否已存在与文件名同名的表:
    • 使用 inspect(self.engine).get_table_names() 检查表是否已存在。
    • 如果存在,跳过该文件。
  3. 如果表不存在,则通过 Pandas 的 to_sql 方法将 DataFrame 写入数据库。

额外说明

  • 表名:使用文件名(去掉扩展名)作为表名。
  • 重复表处理:如果表已存在,输出提示并跳过。

4. 私有方法 _validate_db

def _validate_db(self):

作用

  • 验证 SQL 数据库中的表是否已成功创建,并打印所有表名。

执行流程

  1. 调用 inspect(self.engine).get_table_names() 获取数据库中所有表的列表。
  2. 打印数据库中的表名,便于用户确认表是否成功创建。

5. 公共方法 run_pipeline

def run_pipeline(self):

作用

  • 作为主入口,依次调用 _prepare_db_validate_db,完成数据导入和验证。

执行流程

  1. 调用 _prepare_db 方法,将数据文件转换为 SQL 表。
  2. 调用 _validate_db 方法,验证所有表的创建情况。

示例执行流程

  1. 初始化类实例:
processor = PrepareSQLFromTabularData("path/to/your/files")
  1. 运行数据导入和验证管道:
processor.run_pipeline()
  1. 假设文件夹包含文件 cancer.csvdiabetes.xlsx,数据库中已有表 cancer。程序输出可能如下:
Number of csv files: 2
Table 'cancer' already exists. Skipping...
==============================
All csv files are saved into the sql database.
==============================
Available table names in created SQL DB: ['cancer', 'diabetes']
==============================

关键点总结

  1. SQLAlchemy 的使用

    • 使用 create_engine 连接 SQLite 数据库。
    • 使用 inspect 检查数据库中已存在的表。
  2. 重复表的处理

    • 如果表已存在,则跳过,不覆盖数据。
  3. Pandas 的集成

    • 使用 pd.read_csvpd.read_excel 读取文件。
    • 使用 to_sql 方法将数据写入数据库。
  4. 代码逻辑清晰

    • 数据准备与验证分开处理,方便调试和扩展。

扩展建议

  • 支持其他文件格式:可以扩展支持 JSON 或 Parquet 文件。
  • 异常处理:为数据库连接、文件读取等关键步骤添加更细化的异常处理。
  • 日志功能:将信息输出(如表跳过提示)写入日志文件,便于后续分析。

完整代码:
app_config.yml:

directories:
  stored_csv_xlsx_directory: data/csv_xlsx
  sqldb_directory: data/sqldb.db
  uploaded_files_sqldb_directory: data/uploaded_files_sqldb.db
  stored_csv_xlsx_sqldb_directory: data/csv_xlsx_sqldb.db
  persist_directory: data/chroma

llm_config:
    agent_llm_system_role: "Given the following user question, corresponding SQL query, and SQL result, answer the user question.\n
    Question: {question}\n
    SQL Query: {query}\n
    SQL Result: {result}\n
    Answer: 
    "
    rag_llm_system_role: "You will recieve the user's question along with the search results of that question over a database. Give the user the proper answer."
    engine: "gpt-35-turbo"
    temperature: 0.0

rag_config:
  collection_name: titanic_small
  top_k: 1 

prepare_sqlitedb_from_csv_xlsx.py:

import os
import pandas as pd
from utils.load_config import LoadConfig
from sqlalchemy import create_engine, inspect


class PrepareSQLFromTabularData:
    """
    A class that prepares a SQL database from CSV or XLSX files within a specified directory.

    This class reads each file, converts the data to a DataFrame, and then
    stores it as a table in a SQLite database, which is specified by the application configuration.
    """
    def __init__(self, files_dir) -> None:
        """
        Initialize an instance of PrepareSQLFromTabularData.

        Args:
            files_dir (str): The directory containing the CSV or XLSX files to be converted to SQL tables.
        """
        APPCFG = LoadConfig()
        self.files_directory = files_dir
        self.file_dir_list = os.listdir(files_dir)
        db_path = APPCFG.stored_csv_xlsx_sqldb_directory
        db_path = f"sqlite:///{db_path}"
        self.engine = create_engine(db_path)
        print("Number of csv files:", len(self.file_dir_list))

    def _prepare_db(self):
        """
        Private method to convert CSV/XLSX files from the specified directory into SQL tables.

        Each file's name (excluding the extension) is used as the table name.
        The data is saved into the SQLite database referenced by the engine attribute.
        """
        for file in self.file_dir_list:
            full_file_path = os.path.join(self.files_directory, file)
            file_name, file_extension = os.path.splitext(file)
            if file_extension == ".csv":
                df = pd.read_csv(full_file_path)
            elif file_extension == ".xlsx":
                df = pd.read_excel(full_file_path)
            else:
                raise ValueError("The selected file type is not supported")
            insp = inspect(self.engine)
            # 检查表是否已存在
            insp = inspect(self.engine)
            if file_name in insp.get_table_names():
                print(f"Table '{file_name}' already exists. Skipping...")
            else:
                df.to_sql(file_name, self.engine, index=False)
        print("==============================")
        print("All csv files are saved into the sql database.")

    def _validate_db(self):
        """
        Private method to validate the tables stored in the SQL database.

        It prints out all available table names in the created SQLite database
        to confirm that the tables have been successfully created.
        """
        insp = inspect(self.engine)
        table_names = insp.get_table_names()
        print("==============================")
        print("Available table nasmes in created SQL DB:", table_names)
        print("==============================")

    def run_pipeline(self):
        """
        Public method to run the data import pipeline, which includes preparing the database
        and validating the created tables. It is the main entry point for converting files
        to SQL tables and confirming their creation.
        """
        self._prepare_db()
        self._validate_db()

输出:
在这里插入图片描述
查看sqlite3数据库中的数据:

import pandas as pd
from pyprojroot import here
from sqlalchemy import create_engine, inspect,text


db_path = str(here("data")) + "/csv_xlsx_sqldb.db"
db_path = f"sqlite:///{db_path}"

engine = create_engine(db_path)

def list_tables_and_data(engine):
    # 列出所有表名
    insp = inspect(engine)
    table_names = insp.get_table_names()
    print("Available tables in the database:", table_names)
    
    # 遍历每张表并打印前5行数据
    with engine.connect() as connection:
        for table in table_names:
            print(f"\nData from table '{table}':")
            query = text(f"SELECT * FROM {table} LIMIT 5;")
            result = connection.execute(query)
            for row in result:
                print(row)

list_tables_and_data(engine)

代码运行结果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

各品牌大语言模型汇总

2024年大语言模型快速发展,应用广泛。面对众多选择,我们整理了一份各大语言模型汇总表格,提供清晰参考,助您了解各模型参数(截止日期为2025年1月8日)。 高通智匠AI支持在Windows/Android/MAC等平台上使用 …

xtu oj 1614 数字(加强版)

输出格式# 每行输出一个样例的结果&#xff0c;为一个整数。 样例输入# 3 1 10 101 样例输出# 1 2 3 解题思路&#xff1a;这个题不要想复杂了&#xff0c;很容易超时。 首先需要注意的点&#xff0c;n<10的10000次方&#xff0c;用int或者long long都会爆&#xff0c;所…

【25考研】川大计算机复试情况,重点是啥?怎么准备?

24年进入复试的同学中&#xff0c;有10位同学的复试成绩为0分。具体是个人原因还是校方原因&#xff0c;还尚不明确。但是C哥提醒&#xff0c;一定要认真复习&#xff01;复试完后不要跟任何人讨论有关复试的题目及细节&#xff01; 一、复试内容 四川大学复试内容较多&#xf…

AR 眼镜之-拍照/录像动效切换-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 拍照/录像动效切换 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;第一阶段动效 2&#xff09;第二阶段动效 2. &#x1f4a0; 默认代码配置 2.1 XML 初始布局 2.2 监听滑动对 View 改变 3. ⚛️…

STM32-笔记39-SPI-W25Q128

一、什么是SPI&#xff1f; SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且 在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同时为…

JavaScript动态渲染页面爬取之Selenium

前面这篇博客讲解了 Ajax 的分析方法&#xff0c;利用 Ajax接口可以非常方便地爬取数据。只要能找到 Ajax接口的规律&#xff0c;就可以通过某些参数构造出对应的请求&#xff0c;自然就能轻松爬取数据啦。 但是在很多情况下&#xff0c;Ajax请求的接口含有加密参数&#xff0…

python学习笔记—14—函数

1. 函数 (1) len与my_len str "supercarrydoinb"def my_len(tmp_str):cnt 0for i in tmp_str:cnt 1return cntstr_len_1 len(str) str_len_2 my_len(str) print(f"len {str_len_1}") print(f"my_len {str_len_2}") (2) 函数传参数量不受…

Unity性能优化总结

目录 前言 移动端常见性能优化指标​编辑 包体大小优化 FPS CPU占用率 GPU占用率 内存 发热和耗电量 流量优化 前言 终于有时间了,我将在最近两个项目中进行优化的一些经验进行归纳总结以飨读者。因为我习惯用思维导图,所以归纳的内容主要以图来表达希望对大家有用。…

51单片机——定时器中断(重点)

STC89C5X含有3个定时器&#xff1a;定时器0、定时器1、定时器2 注意&#xff1a;51系列单片机一定有基本的2个定时器&#xff08;定时器0和定时器1&#xff09;&#xff0c;但不全有3个中断&#xff0c;需要查看芯片手册&#xff0c;通常我们使用的是基本的2个定时器&#xff…

基于html5实现音乐录音播放动画源码

源码介绍 基于html5实现音乐录音播放动画源码是一款类似Shazam的UI&#xff0c;点击按钮后&#xff0c;会变成为一个监听按钮。旁边会有音符飞入这个监听按钮&#xff0c;最后转换成一个音乐播放器。 效果预览 源码获取 基于html5实现音乐录音播放动画源码

对话|全年HUD前装将超330万台,疆程技术瞄准人机交互“第一屏”

2024年&#xff0c;在高阶智驾进入快速上车的同时&#xff0c;座舱人机交互也在迎来新的增长点。Chat GPT、AR-HUD、车载投影等新配置都在带来新增量机会。 高工智能汽车研究院监测数据显示&#xff0c;2024年1-10月&#xff0c;中国市场&#xff08;不含进出口&#xff09;乘用…

【技术支持】安卓无线adb调试连接方式

Android 10 及更低版本&#xff0c;需要借助 USB 手机和电脑需连接在同一 WiFi 下&#xff1b;手机开启开发者选项和 USB 调试模式&#xff0c;并通过 USB 连接电脑&#xff08;即adb devices可以查看到手机&#xff09;&#xff1b;设置手机的监听adb tcpip 5555;拔掉 USB 线…

Dependency check 通过Maven构建时,配置Mysql数据库遇到的三个坑

使用过Dependency check的同学&#xff0c;一定会遇到这个问题—— 每次执行依赖扫描时&#xff0c;由于网络问题会导致NVD下载种子数据的过程中的种种失败&#xff0c;不仅浪费了大量时间&#xff0c;还会因为下载文件的不完整性直接导致依赖检测的失败。所以我在使用Dependen…

uniApp通过xgplayer(西瓜播放器)接入视频实时监控

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

【OJ刷题】同向双指针问题

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;OJ刷题入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1…

Ubuntu中使用miniconda安装R和R包devtools

安装devtools环境包 sudo apt-get install gfortran -y sudo apt-get install build-essential -y sudo apt-get install libxt-dev -y sudo apt-get install libcurl4-openssl-dev -y sudo apt-get install libxml2.6-dev -y sudo apt-get install libssl-dev -y sudo apt-g…

《分布式光纤测温:解锁楼宇安全的 “高精度密码”》

在楼宇建筑中&#xff0c;因其内部空间庞大&#xff0c;各类电器设施众多&#xff0c;如何以一种既高效又稳定&#xff0c;兼具低成本与高覆盖特性的方式&#xff0c;为那些关键线路节点开展温度监测&#xff0c;是目前在安全监测领域一项重点研究项目&#xff0c;而无锡布里渊…

git撤回提交、删除远端某版本、合并指定版本的更改

撤回提交 vscode的举例 一、只提交了还未推送的情况下 1.撤回最后一次提交&#xff0c;把最后一次提交的更改放到暂存区 git reset --soft HEAD~12.撤回最后一次提交&#xff0c;把最后一次提交的更改放到工作区 git reset --mixed HEAD~13.撤回最后一次提交&#xff0c;不…

【Spring Boot】Spring AOP 快速上手指南:开启面向切面编程新旅程

前言 &#x1f31f;&#x1f31f;本期讲解关于spring aop的入门介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不…

开源CMS建站系统的安全优势有哪些?

近年来&#xff0c;用户们用开源CMS系统搭建网站的比例也越来越高&#xff0c;它为用户提供了便捷的网站建设解决方案。其中&#xff0c;亿坊CMS建站系统更因安全方面备受用户欢迎&#xff0c;下面带大家一起全面地了解一下。 一、什么是开源CMS&#xff1f; 开源CMS指的是那…