Python Pandas读取Excel并生成SQL WHERE条件

 更新时间:2026年07月15日 09:13:50   作者:weixin_30777913  
本文主要介绍了如何使用Python Pandas读取Excel,自动处理空值、字符串转义和日期格式,并按100条一批生成OR连接的WHERE条件,轻松搞定数据查询拼接,避免引号错误和格式问题,让你的数据分析更高效

完整代码

以下代码实现了用 Pandas 读取 Excel,并按要求生成分批的 SQL WHERE 条件:

import pandas as pd
import numpy as np
from math import ceil

def build_condition(field, value):
    """根据字段值和类型构造单个条件片段"""
    if pd.isna(value):
        return f"{field} IS NULL"
    
    # 处理日期时间类型
    if isinstance(value, (pd.Timestamp, np.datetime64)):
        # 转换为 SQL 标准格式的字符串
        val_str = pd.to_datetime(value).strftime('%Y-%m-%d %H:%M:%S')
        return f"{field} = '{val_str}'"
    
    # 处理字符串类型
    if isinstance(value, str):
        # 转义单引号:替换为一个单引号为两个单引号
        escaped = value.replace("'", "''")
        return f"{field} = '{escaped}'"
    
    # 处理数值类型(int, float, np.number)
    if isinstance(value, (int, float, np.number)):
        return f"{field} = {value}"
    
    # 其他情况(例如布尔值等)作为字符串处理
    val_str = str(value).replace("'", "''")
    return f"{field} = '{val_str}'"

def generate_where_batches(df, batch_size=100):
    """
    将 DataFrame 的每一行转换为 AND 连接的条件组,
    每 batch_size 个组用 OR 连接为一批,返回批次的列表
    """
    fields = df.columns.tolist()
    row_conditions = []
    
    for _, row in df.iterrows():
        # 构建单个行的条件列表
        conds = []
        for field in fields:
            cond = build_condition(field, row[field])
            conds.append(cond)
        # 用 AND 连接,并加上括号形成一个条件组
        group = "(" + " AND ".join(conds) + ")"
        row_conditions.append(group)
    
    # 分批,每 batch_size 个组用 OR 连接
    batches = []
    for i in range(0, len(row_conditions), batch_size):
        batch_groups = row_conditions[i:i+batch_size]
        batch_str = " OR ".join(batch_groups)
        batches.append(batch_str)
    
    return batches

# ------------------- 使用示例 -------------------
if __name__ == "__main__":
    # 请替换为实际的 Excel 文件路径
    excel_file = "data.xlsx"
    
    # 读取 Excel(默认读取第一个 sheet)
    df = pd.read_excel(excel_file)
    
    # 生成批次条件(每 100 条记录为一批)
    batches = generate_where_batches(df, batch_size=100)
    
    # 打印输出每一批
    for idx, batch in enumerate(batches, start=1):
        print(f"--- 第 {idx} 批 (WHERE 条件部分) ---")
        print(batch)
        print()  # 空行分隔

主要特性说明

  • 空值处理pd.isna() 检测缺失值,生成 字段 IS NULL
  • 字符串与日期:字符串值用单引号包裹,内部单引号替换为两个单引号;日期时间格式化为 'YYYY-MM-DD HH:MM:SS' 并加单引号。
  • 数字:整数、浮点数直接拼接,不加引号。
  • 分批输出:每 100 个行条件组用 OR 连接为一批,打印时按批次输出。

使用前准备

安装依赖(若未安装):

pip install pandas openpyxl

将脚本中的 excel_file 路径改为你的 Excel 文件实际路径。

运行脚本即可看到控制台输出的分批 WHERE 条件。

示例输出片段

假设 Excel 有三行数据:

nameagecreated_at
John302023-01-01 10:00:00
NULL25NULL
O’Brien402023-02-01 12:30:00

生成的第一批(此处只有 3 条,仍按 100 条分一批):

--- 第 1 批 (WHERE 条件部分) ---
(name = 'John' AND age = 30 AND created_at = '2023-01-01 10:00:00') OR (name IS NULL AND age = 25 AND created_at IS NULL) OR (name = 'O''Brien' AND age = 40 AND created_at = '2023-02-01 12:30:00')

注意 O'Brien 被正确转义为 'O''Brien'

知识扩展

在实际工作中,我们经常需要从 Excel 中读取一批 ID 或条件值,然后生成用于数据库查询的 SQL WHERE 子句。如果数据量很大,一次性使用 IN 可能导致查询语句过长或性能下降,因此分批生成是更好的实践。

下面我们以 Pandas 读取 Excel,并按指定批次大小生成多组 WHERE column IN (...) 条件的完整方案。

目标

读取 Excel 文件中的某一列(例如用户 ID、订单号等)

将该列的值按指定批次大小(如 1000)分组

为每组生成一个 SQL WHERE 条件字符串,形如:

WHERE id IN (101, 102, 103, ...)

支持去重、过滤空值、自定义列名和批次大小

所需库

pip install pandas openpyxl

完整代码示例

import pandas as pd
import math
def generate_batch_where_clauses(
    excel_path: str,
    sheet_name: str = 0,
    column_name: str = 'id',
    batch_size: int = 1000,
    output_file: str = None
):
    """
    读取 Excel 指定列,按批次生成 SQL WHERE 条件
    参数:
        excel_path: Excel 文件路径
        sheet_name: 工作表名称或索引,默认第一个
        column_name: 需要提取的列名
        batch_size: 每批包含的值个数
        output_file: 可选,输出到文本文件
    返回:
        list: 每个批次生成的 WHERE 子句字符串
    """
    # 1. 读取 Excel
    df = pd.read_excel(excel_path, sheet_name=sheet_name)
    # 2. 检查列是否存在
    if column_name not in df.columns:
        raise ValueError(f"列 '{column_name}' 不存在于 Excel 中,可用的列有: {df.columns.tolist()}")
    # 3. 提取该列,去除空值,去重,转换为 Python 列表
    values = df[column_name].dropna().unique().tolist()
    if not values:
        print("警告:没有有效的值,请检查数据。")
        return []
    # 4. 分批
    total = len(values)
    batch_count = math.ceil(total / batch_size)
    where_clauses = []
    for i in range(batch_count):
        start = i * batch_size
        end = min((i + 1) * batch_size, total)
        batch_values = values[start:end]
        # 将值转换为字符串,注意处理字符串类型需要加引号
        # 这里简单处理:如果是数值类型,直接转为字符串,否则加单引号
        first_val = batch_values[0]
        if isinstance(first_val, (int, float)):
            value_strs = [str(v) for v in batch_values]
        else:
            # 如果包含字符串,需要转义单引号(如 O'Reilly -> O''Reilly)
            value_strs = [f"'{str(v).replace("'", "''")}'" for v in batch_values]
        in_clause = ", ".join(value_strs)
        where_clause = f"WHERE {column_name} IN ({in_clause})"
        where_clauses.append(where_clause)
        # 可选打印
        print(f"批次 {i+1}/{batch_count}: {len(batch_values)} 个值")
        print(where_clause)
        print("-" * 80)
    # 5. 若指定输出文件,则写入
    if output_file:
        with open(output_file, 'w', encoding='utf-8') as f:
            for clause in where_clauses:
                f.write(clause + ";\n")   # 加个分号便于直接使用
        print(f"所有 WHERE 子句已保存到: {output_file}")
    return where_clauses
# 使用示例
if __name__ == "__main__":
    generate_batch_where_clauses(
        excel_path="data.xlsx",
        sheet_name="Sheet1",
        column_name="user_id",
        batch_size=500,
        output_file="where_clauses.sql"
    )

自定义进阶:处理多个列(组合条件)

如果需要根据多列生成 WHERE 条件(例如 WHERE col1=val1 AND col2=val2),可以扩展上述函数,将每一行作为一个条件组合。

def generate_composite_where_clauses(excel_path, sheet_name=0, columns=None, batch_size=1000):
    """
    根据多列生成组合 WHERE 条件,每行一组条件
    columns: 要使用的列名列表,如 ['region', 'status']
    """
    df = pd.read_excel(excel_path, sheet_name=sheet_name)
    if columns is None:
        columns = df.columns.tolist()
    # 构建条件列表(每行一个元组)
    conditions = []
    for _, row in df.iterrows():
        # 跳过含空值的行
        if row[columns].isnull().any():
            continue
        # 生成类似 "col1='A' AND col2=1" 的字符串
        parts = []
        for col in columns:
            val = row[col]
            if isinstance(val, str):
                val_escaped = val.replace("'", "''")
                parts.append(f"{col} = '{val_escaped}'")
            else:
                parts.append(f"{col} = {val}")
        conditions.append(" AND ".join(parts))
    # 去重
    conditions = list(set(conditions))
    # 分批
    total = len(conditions)
    batch_count = math.ceil(total / batch_size)
    where_clauses = []
    for i in range(batch_count):
        batch = conditions[i*batch_size:(i+1)*batch_size]
        # 组合为 OR 连接
        or_clause = " OR ".join([f"({cond})" for cond in batch])
        where_clause = f"WHERE {or_clause}"
        where_clauses.append(where_clause)
    return where_clauses

注意事项

  • SQL 注入风险:如果值来自外部输入,直接拼接可能存在安全风险,但在内部数据迁移场景下,通常可以接受。如需严格防范,可使用参数化查询。
  • 值类型处理:字符串值需要加单引号,并对内部的单引号转义(' 变成 '')。日期、布尔等类型需按数据库语法处理。
  • 批次大小:建议根据数据库限制(如 Oracle 的 IN 列表长度限制为 1000)和网络传输性能设定合适的批次大小。
  • 性能考虑:对于几百万行数据,分批生成并执行可避免超长 SQL 和内存溢出。

到此这篇关于Python Pandas读取Excel并生成SQL WHERE条件的文章就介绍到这了,更多相关Python Pandas读取Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python cumsum函数的具体使用

    python cumsum函数的具体使用

    这篇文章主要介绍了python cumsum函数的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python如何定义一个能接收可选参数的装饰器

    Python如何定义一个能接收可选参数的装饰器

    在Python编程中,装饰器是一种强大的元编程工具,它允许开发者​​在不修改原函数代码​​的情况下增强函数功能,本文将深入探讨可选参数装饰器的实现原理、技术细节和实际应用,有需要的可以了解下
    2025-10-10
  • 总结python中pass的作用

    总结python中pass的作用

    在本篇内容里我们给读者们分享了关于python中pass的作用以及相关实例代码,有需要的朋友们学习下。
    2019-02-02
  • 利用python合并csv文件的方式实例

    利用python合并csv文件的方式实例

    由于项目取数需要,要将两个不同的csv文件合并到一个文件中,所以下面这篇文章主要给大家介绍了关于利用python合并csv文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • python匿名函数的使用方法解析

    python匿名函数的使用方法解析

    这篇文章主要介绍了python匿名函数的使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Python中使用Opencv开发停车位计数器功能

    Python中使用Opencv开发停车位计数器功能

    这篇文章主要介绍了Python中使用Opencv开发停车位计数器,本教程最好的一点就是我们将使用基本的图像处理技术来解决这个问题,没有使用机器学习、深度学习进行训练来识别,感兴趣的朋友跟随小编一起看看吧
    2022-04-04
  • DenseNet121模型实现26个英文字母识别任务

    DenseNet121模型实现26个英文字母识别任务

    这篇文章主要为大家介绍了DenseNet121模型实现26个英文字母识别任务的实例过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Python元组及文件核心对象类型详解

    Python元组及文件核心对象类型详解

    本篇文章主要给大家详细讲述了Python核心对象类型之元组及文件的相关内容,对此有兴趣的学习下。
    2018-02-02
  • 使用Python创建自助抢单插件的完整步骤

    使用Python创建自助抢单插件的完整步骤

    文章介绍了如何使用Python编写一个自助抢单插件,该插件可以帮助用户监控特定网站上的商品信息,并在条件满足时自动下单,文章涵盖了从项目概述、技术架构、项目流程到环境准备、网络请求、数据解析、用户界面设计和定时任务的详细步骤
    2024-11-11
  • python实现协程的具体示例

    python实现协程的具体示例

    协程是一种轻量级的并发编程技术,它允许程序在某个点上暂停执行,本文主要介绍了python实现协程的具体示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03

最新评论