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

将指定目录下的 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_xlsxsqldb_directory: data/sqldb.dbuploaded_files_sqldb_directory: data/uploaded_files_sqldb.dbstored_csv_xlsx_sqldb_directory: data/csv_xlsx_sqldb.dbpersist_directory: data/chromallm_config:agent_llm_system_role: "Given the following user question, corresponding SQL query, and SQL result, answer the user question.\nQuestion: {question}\nSQL Query: {query}\nSQL Result: {result}\nAnswer: "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.0rag_config:collection_name: titanic_smalltop_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, inspectclass 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 thenstores 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_dirself.file_dir_list = os.listdir(files_dir)db_path = APPCFG.stored_csv_xlsx_sqldb_directorydb_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 databaseto 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 databaseand validating the created tables. It is the main entry point for converting filesto 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,textdb_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.mzph.cn/diannao/66533.shtml

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

相关文章

设计模式 行为型 策略模式(Strategy Pattern)与 常见技术框架应用 解析

策略模式(Strategy Pattern)核心思想是将算法的实现从使用该算法的类中分离出来,作为独立的对象,通过接口来定义算法家族,这样就可以很容易地改变或扩展算法。通过这种方式,可以避免在客户端代码中使用大量…

如何操作github,gitee,gitcode三个git平台建立镜像仓库机制,这样便于维护项目只需要维护一个平台仓库地址的即可-优雅草央千澈

如何操作github,gitee,gitcode三个git平台建立镜像仓库机制,这样便于维护项目只需要维护一个平台仓库地址的即可-优雅草央千澈 问题背景 由于我司最早期19年使用的是gitee,因此大部分仓库都在gitee有几百个库的代码,…

B+树的原理及实现

文章目录 B树的原理及实现一、引言二、B树的特性1、结构特点2、节点类型3、阶数 三、B树的Java实现1、节点实现2、B树操作2.1、搜索2.2、插入2.3、删除2.4、遍历 3、B树的Java实现示例 四、总结 B树的原理及实现 一、引言 B树是一种基于B树的树形数据结构,它在数据…

大纲笔记幕布的替换

文章目录 前言类似的大纲软件探索 DynalistLogseq通过国内代码仓库建立 Git 仓库Logseq 的使用PC 端安卓端Git 操作Termux git 步骤Termux 的桌面组件:Termux widget 报错参考 前言 之前我一直用幕布,买了三年,奈何要过期了,又三…

MoEs and Transformers 笔记

ref:https://huggingface.co/blog/zh/moe#%E7%94%A8router-z-loss%E7%A8%B3%E5%AE%9A%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83 MoEs and Transformers Transformer 类模型明确表明,增加参数数量可以提高性能,因此谷歌使用 GShard 尝试将 Transformer 模型…

ubuntu为Docker配置代理

终端代理 我们平常在ubuntu终端中使用curl或git命令时,往往会很慢。 所以,首先需要给ubuntu终端环境添加代理。 查看自身那个软件的端口号,我这里是7890。 sudo gedit ~/.bashrcexport http_proxyhttp://localhost:7890 export https_pr…

【安卓开发】【Android Studio】项目构建失败提示【Could not read metadata.bin】解决方法

一、问题说明 在Android Studio中开发安卓项目时,项目构建失败,提示如下: Could not read workspace data from xxx/xxx/(某个目录,和gradle有关):could not read ...metadata.bin&#xff08…

EXCEL: (二) 常用图表

10. 图表 134-添加.删除图表元素 图表很少是一个单独的整体,而是由十几种元素/对象拼凑出来的。 学习图表就是学习当中各类元素的插删改。 ①图表中主要元素的定义 图表上的一个颜色就是一个系列。 横轴是分类轴,将每个系列都分为几类。 ②选中图…

sys.dm_exec_connections:查询与 SQL Server 实例建立的连接有关的信息以及每个连接的详细信息(客户端ip)

文章目录 引言I 基于dm_exec_connections查询客户端ip权限物理联接时间范围dm_exec_connections表see also: 监视SQL Server 内存使用量资源信号灯 DMV sys.dm_exec_query_resource_semaphores( 确定查询执行内存的等待)引言 查询历史数据库客户端ip应用场景: 安全分析缺乏…

阿里云发现后门webshell,怎么处理,怎么解决?

当收到如下阿里云通知邮件时,大部分管理员都会心里一惊吧!出现Webshell,大概是网站被入侵了。 尊敬的 xxxaliyun.com: 云盾云安全中心检测到您的服务器:47.108.x.xx(xx机)出现了紧急安全事件…

【大模型】百度千帆大模型对接LangChain使用详解

目录 一、前言 二、LangChain架构与核心组件 2.1 LangChain 核心架构 2.2 LangChain 核心组件 三、环境准备 3.1 前置准备 3.1.1 创建应用并获取apikey 3.1.2 开通付费功能 3.2 获取LangChain文档 3.3 安装LangChain依赖包 四、百度千帆大模型对接 LangChain 4.1 LL…

maven如何从外部导包

1.找到你项目的文件位置,将外部要导入的包复制粘贴进你当前要导入的项目下。 2.从你的项目目录下选中要导入的包的pom文件即可导包成功 注意一定是选中对应的pom文件 导入成功之后对应的pom.xml文件就会被点亮

graylog配置日志关键字邮件Email告警

文章目录 前言一、配置邮箱报警二、邮件告警配置1.设置邮箱告警通知2.设置告警事件 三、告警结果示例 前言 在TO/B、TO/C项目的告警链路中,端口告警、服务器基础资源告警、接口告警等不同类型的告警都扮演着重要角色。这些告警能够帮助团队及时发现潜在的系统问题&…

GraphQL:强大的API查询语言

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

集合卡尔曼滤波ENKF的学习笔记

集合卡尔曼滤波ENKF的学习笔记 什么是数据同化?天气模型预测是25C(这叫"背景场"),实际观测是23C(这叫"观测值"),数据同化就是把这两个信息合理结合。 # 最简单的组合方式&…

DeepSeek-V3 通俗详解:从诞生到优势,以及与 GPT-4o 的对比

1. DeepSeek 的前世今生 1.1 什么是 DeepSeek? DeepSeek 是一家专注于人工智能技术研发的公司,致力于打造高性能、低成本的 AI 模型。它的目标是让 AI 技术更加普惠,让更多人能够用上强大的 AI 工具。 1.2 DeepSeek-V3 的诞生 DeepSeek-V…

UI自动化测试保姆级教程--pytest详解(精简易懂)

欢迎来到啊妮莫的学习小屋 别让过去的悲伤,毁掉当下的快乐一《借东西的小人阿莉埃蒂》 简介 pytest是一个用于Python的测试框架, 支持简单的单元测试和复杂的功能测试. 和Python自带的UnitTest框架类似, 但是相比于UnitTest更加简洁, 效率更高. 特点 非常容易上手…

Javascript算法——贪心算法(一)

贪心算法详解(JavaScript)(局部最优->全局最优) 贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下的最优选择(局部最优)的算法设计方法。通过局部最优解的累积&…

CK18——肝损伤无创诊断标志物

肝脏作为人体至关重要的代谢与解毒器官,极易遭受病毒、药物、酒精及不良饮食等多种因素的损害,进而引发一系列如非酒精性脂肪肝(NAFLD)、肝纤维化、肝硬化、肝细胞癌以及各类肝炎等病症。因此,确定一种高可靠性、非侵入…

.NET Core + Kafka 开发指南

什么是Kafka Apache Kafka是一个分布式流处理平台,由LinkedIn开发并开源,后来成为Apache软件基金会的顶级项目。Kafka主要用于构建实时数据管道和流式应用程序。 Kafka 架构 从下面3张架构图中可以看出Kafka Server 实际扮演的是Broker的角色, 一个Kafka Cluster由多个Bro…