如何用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
相关产品推荐
相关产品推荐

