You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用with open读取CSV后批量写入MariaDB表(无需逐行INSERT)

高效导入CSV到MariaDB的替代方案

1. MariaDB原生LOAD DATA INFILE(首推)

这是处理百万级数据最快的方式,完全无需Python循环处理,直接让数据库读取CSV完成导入,性能远高于逐条插入。

使用示例:

如果CSV和数据库在同一服务器,执行以下SQL(可通过Python数据库连接执行):

LOAD DATA INFILE '/绝对路径/filename.csv'
INTO TABLE 你的表名
FIELDS TERMINATED BY ','       -- 匹配CSV的字段分隔符,比如制表符填'\t'
ENCLOSED BY '"'                 -- 若字段用双引号包裹则添加
LINES TERMINATED BY '\n'        -- 行分隔符,按需调整
IGNORE 1 LINES;                 -- 有表头则跳过第一行

如果CSV在本地机器、数据库在远程,添加LOCAL关键字:

LOAD DATA LOCAL INFILE '/本地路径/filename.csv'
INTO TABLE 你的表名
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

注意:

  • 需确保MariaDB服务器开启local_infile参数
  • Python连接数据库时,驱动(如mysql-connector-python)要设置allow_local_infile=True

2. Python批量插入(executemany)

如果必须用Python预处理数据,不要逐条执行INSERT,用executemany批量提交,减少数据库交互次数:

import csv
import mysql.connector

# 建立数据库连接
conn = mysql.connector.connect(
    host='你的主机地址',
    user='用户名',
    password='密码',
    database='数据库名'
)
cursor = conn.cursor()

# 插入模板,占位符数量要和表的列数一致
insert_sql = "INSERT INTO 你的表名 VALUES (%s, %s, %s)"
batch_size = 1000  # 每1000条提交一次,可根据内存调整
batch_data = []

with open(r"filename.csv", 'r') as file:
    csvreader = csv.reader(file)
    next(csvreader)  # 跳过表头(如果有)
    for row in csvreader:
        batch_data.append(tuple(row))
        if len(batch_data) >= batch_size:
            cursor.executemany(insert_sql, batch_data)
            conn.commit()
            batch_data = []
    # 提交剩余数据
    if batch_data:
        cursor.executemany(insert_sql, batch_data)
        conn.commit()

cursor.close()
conn.close()

提示:

  • 可根据机器内存调整batch_size,比如2000或5000,避免内存溢出
  • 不同数据库驱动的占位符格式基本一致(pymysql同样用%s)

内容的提问来源于stack exchange,提问作者frustrated_gerbil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:22:47