从URL获取CSV存储到MySQL仅加载首行问题解决求助
问题根因
- CSV读取和数据库插入逻辑完全分离:遍历CSV时仅打印了行内容,没有将行存储下来供后续插入使用,遍历结束后仅执行了1次插入操作,只会写入单次获取到的行数据
- SQL语句占位符使用错误:mysql.connector的参数占位符
%s不需要额外包裹双引号,引号会被识别为值的一部分,引发数据异常或插入错误 - 资源释放逻辑不严谨:出现异常时可能会遗留未关闭的数据库连接和游标,造成资源泄漏
修正后代码
import requests from contextlib import closing import csv import mysql.connector as mysql from mysql.connector import Error # CSV地址 url = "https://www.raidbots.com/reports/n671gAXSsFLwzz7uvB7JYs/data.csv" # 存储所有CSV行数据 all_rows = [] with closing(requests.get(url, stream=True)) as r: f = (line.decode('utf-8') for line in r.iter_lines()) empdata = csv.reader(f, delimiter=',', quotechar='"') # 跳过表头(如果不需要跳过可删除下一行) next(empdata) for row in empdata: # 只保留前6列,和表结构对应,避免列数不匹配报错 all_rows.append(row[:6]) print(row) conn = None cursor = None try: conn = mysql.connect( user='替换为你的用户名', password='替换为你的密码', host='替换为你的数据库地址', database='替换为你的库名' ) if conn.is_connected(): cursor = conn.cursor() cursor.execute("select database();") record = cursor.fetchone() print("已连接到数据库: ", record) cursor.execute('DROP TABLE IF EXISTS data_scraper_table;') print('正在创建表....') cursor.execute("CREATE TABLE data_scraper_table(col1 varchar(255),col2 varchar(255),col3 varchar(255),col4 varchar(255),col5 varchar(255),col6 varchar(255))") print("表创建完成....") # 批量插入所有数据,效率远高于逐行插入 insert_sql = "INSERT INTO data_scraper_table(col1,col2,col3,col4,col5,col6) VALUES(%s, %s, %s, %s, %s, %s)" cursor.executemany(insert_sql, all_rows) conn.commit() print(f"成功插入{cursor.rowcount}条数据") except Error as e: print("MySQL操作出错: ", e) if conn: conn.rollback() finally: # 无论是否报错都释放资源 if cursor: cursor.close() if conn and conn.is_connected(): conn.close()
额外说明
- 如果需要将CSV表头也作为数据入库,删除
next(empdata)这一行即可 - 若CSV列数有变化,需要同步修改建表语句的字段数量,以及插入语句的占位符数量,保证和列数匹配
- 数据量超过10万条时建议分批次插入,避免内存占用过高
内容的提问来源于stack exchange,提问作者jpm
相关产品推荐
相关产品推荐

