Python任意字典写入MySQL

前言

应用场景
爬虫数据写入数据库
优点
简洁、通用、直接复制可用
先修基础!
1、 Python 任意字典生成 insert 语句
2、 Python 任意字典生成 update 语句
3、 Python 连接 MySQL 基础

INSERT

import pymysql

class Mysql:
    def __init__(self, db_name, tb_name):
        self.db = pymysql.connect(
            host='localhost', user='root', password='yellow', charset='utf8', db=db_name)
        self.cursor = self.db.cursor()
        self.tb = tb_name

    def __del__(self):
        self.cursor.close()
        self.db.close()

    def insert(self, dt):
        ls = [(k, dt[k]) for k in dt if dt[k] is not None]
        sql = 'insert %s (' % self.tb + ','.join(i[0] for i in ls) +\
              ') values (' +
<think>好的,我现在需要回答用户的问题,如何用Python通过循环将字典数据写入文件或数据库。首先,我得回忆一下相关的知识,确保步骤正确,并且覆盖用户提到的文件和数据库两种情况。 用户提到了循环写入,所以可能需要处理多个字典的情况,比如列表中的多个字典。同时,用户可能希望看到具体的代码示例,而不仅仅是理论上的步骤。我需要分两种情况来处理:写入文件和写入数据库。 对于写入文件,常见的方法是将字典转换为字符串格式,比如JSON或CSV。JSON比较适合嵌套结构,而CSV则适合表格形式的数据。使用循环遍历每个字典,然后写入文件。需要注意文件打开的模式,比如追加模式'a'或者写入模式'w',以及确保正确关闭文件或者使用with语句自动处理。 然后是写入数据库,这里用户可能指的是MySQL或者其他关系型数据库。需要用到Python的数据库连接库,比如mysql-connector-python或者sqlite3。步骤包括建立连接、创建游标、执行SQL语句(比如INSERT),然后提交事务并关闭连接。对于字典数据,需要将键值对映射到数据库表的字段,可能需要处理动态生成SQL语句的问题,比如根据字典的键来构造INSERT语句的列名。 用户提供的引用中提到了将字典存入MySQL,这可以作为参考。例如,引用[1]提到使用数据库操作库,引用[2]提到处理没有记录的情况。不过用户的问题主要是写入,而不是查询,所以重点应该放在插入数据上。但需要考虑异常处理,比如重复插入或者字段不匹配的情况吗?可能用户暂时不需要,但最好简单提及。 接下来,我需要组织步骤。对于文件写入,可以分JSON和CSV两种情况给出示例。对于数据库,以MySQL为例,展示如何连接、插入数据,并处理多个字典的情况。 在代码示例中,需要确保正确性。例如,使用json.dump()时,确保文件以写入模式打开,并且处理编码。对于CSV,可能需要使用csv.DictWriter来写入字典数据。循环遍历列表中的每个字典,依次写入。 数据库部分,可能需要先创建表结构,假设用户已经有表,或者动态创建。这里可能需要用户事先定义好表结构,或者根据字典的键自动创建,但后者比较复杂,可能超出当前问题范围。所以示例中应假设表已经存在,字段与字典键对应。 在示例代码中,注意使用参数化查询,避免SQL注入,比如使用占位符%s,然后将字典的值作为元组传递。循环执行游标的execute方法,或者使用executemany来批量插入。 此外,用户可能需要处理异常,比如连接失败、插入错误等,但可能不需要太详细,但可以提及使用try-except块。 现在,我需要将上述思路整理成结构清晰的回答,分文件和数据库两部分,每部分给出步骤和代码示例。同时,注意使用中文,符合格式要求,比如行内公式用$...$,但这个问题可能不涉及数学公式,所以可能不需要。但需要检查是否有遗漏。 最后,生成相关问题,比如不同文件格式的优缺点,如何优化数据库写入性能,如何处理字段不匹配等。</think>### 如何通过循环将Python字典写入文件或数据库 #### 1. **写入文本文件** ##### (1) 使用JSON格式 将字典逐行写入JSON文件,适合需要保留数据结构或嵌套数据的场景。 ```python import json data_list = [ {"id": 1, "name": "Alice", "score": 95}, {"id": 2, "name": "Bob", "score": 88}, {"id": 3, "name": "Charlie", "score": 76} ] with open("data.json", "w", encoding="utf-8") as f: for item in data_list: json.dump(item, f, ensure_ascii=False) # 禁止ASCII转义 f.write("\n") # 换行分隔每条记录 ``` ##### (2) 使用CSV格式 将字典按表格形式写入CSV文件,适合需要结构化存储的场景。 ```python import csv data_list = [ {"id": 1, "name": "Alice", "score": 95}, {"id": 2, "name": "Bob", "score": 88}, {"id": 3, "name": "Charlie", "score": 76} ] with open("data.csv", "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=["id", "name", "score"]) writer.writeheader() # 写入表头 for item in data_list: writer.writerow(item) ``` --- #### 2. **写入数据库(以MySQL为例)** ##### (1) 使用`mysql-connector-python`库 需要提前安装库:`pip install mysql-connector-python` *步骤说明:* 1. **建立数据库连接** 2. **遍历字典列表生成SQL语句** 3. **批量执行插入操作** ```python import mysql.connector data_list = [ {"id": 1, "name": "Alice", "score": 95}, {"id": 2, "name": "Bob", "score": 88}, {"id": 3, "name": "Charlie", "score": 76} ] # 连接数据库 conn = mysql.connector.connect( host="localhost", user="root", password="your_password", database="test_db" ) cursor = conn.cursor() # 创建表(假设表不存在) cursor.execute(""" CREATE TABLE IF NOT EXISTS students ( id INT PRIMARY KEY, name VARCHAR(50), score INT ) """) # 循环插入数据 for item in data_list: sql = "INSERT INTO students (id, name, score) VALUES (%s, %s, %s)" values = (item["id"], item["name"], item["score"]) cursor.execute(sql, values) conn.commit() # 提交事务 cursor.close() conn.close() ``` ##### (2) 使用`executemany`优化批量插入 ```python # 提取所有字典的值组成元组列表 values = [(item["id"], item["name"], item["score"]) for item in data_list] # 批量插入 cursor.executemany( "INSERT INTO students (id, name, score) VALUES (%s, %s, %s)", values ) ``` --- #### 3. **关键注意事项** 1. **文件写入** - JSON格式需用`ensure_ascii=False`避免中文乱码 - CSV格式需指定`newline=""`防止空行问题[^2] 2. **数据库写入** - 使用参数化查询(`%s`占位符)防止SQL注入 - 批量操作时优先选择`executemany`提升性能[^1] ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值