python 基础 9.9 查询数据

本文介绍了一个Python脚本,用于从名为'students'的数据库中查询具有重复姓名的学生记录,并将查询结果输出到文本文件中。该脚本连接到指定的MySQL数据库,执行SQL查询以查找重复姓名的学生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
#/usr/bin/python
#-*- coding:utf-8 -*-
#@Time   :2017/11/24 4:21
#@Auther :liuzhenchuan
#@File   :查询数据.py
 
# 查询数据库
import codecs
 
import MySQLdb
 
select_student = '''select * from student where stdname in (select stdname from student  group by stdname having count(1)>1) order by stdname;'''
def connect_mysql():
    db_config = {
        "host": "192.168.16.70",
        "port": 3306,
        "user": "root",
        "passwd": "123123",
        "db": "students",
        "charset": "utf8"
    }
    try:
        cnx = MySQLdb.connect(**db_config)
    except Exception as e:
        raise e
    return cnx
 
 
if __name__ == "__main__":
    cnx = connect_mysql()
    cus = cnx.cursor()
    try:
        cus.execute(select_student)
        result = cus.fetchall()
        print(result)
        with codecs.open("select.txt", "w") as f:
            for line in result:
                f.write(str(line))
                f.write("\n")
        cus.close()
        cnx.commit()
    except Exception as e:
        cnx.rollback()
        raise e
    finally:
        cnx.close()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/lzcys8868/p/7888752.html

<think>好的,我现在需要帮用户解决如何将二维数据转换为字典的问题。首先,我得理解用户的需求。他们可能有一个二维的数据结构,比如列表的列表或者CSV文件中的数据,想要转换成字典形式,方便通过键值对访问。 首先,我要回忆Python中处理二维数据转字典的常用方法。可能的方法包括使用字典推导式、zip函数,或者结合pandas库。另外,用户可能希望不同的转换方式,比如将每一行作为一个键值对,或者将某一列作为键,另一列作为值。 接下来,我需要考虑用户可能的场景。例如,他们可能从CSV文件中读取了数据,或者有一个二维列表,需要转换成字典以便快速查找。这时候,用户可能需要多种方法,比如将第一列作为键,剩下的作为值,或者将整个行转换为嵌套字典。 然后,我需要考虑用户可能的进阶需求。比如处理重复键的问题,这时候可能需要将值保存为列表,或者在键冲突时进行合并。此外,用户可能对性能有要求,特别是处理大数据量时,可能需要高效的方法。 还要注意异常处理,比如数据维度不一致的情况,或者键重复的情况,应该给出相应的解决方案。例如,使用setdefault来处理重复键,或者检查数据长度。 另外,用户可能对不同的数据结构转换感兴趣,比如二维列表、NumPy数组或pandas DataFrame,需要分别给出示例。特别是pandas的to_dict方法,非常灵活,可以生成不同的字典格式,如&#39;records&#39;、&#39;index&#39;等,这些都应该涵盖到。 最后,需要总结最佳实践,帮助用户根据具体情况选择合适的方法。比如小数据用原生方法,大数据用pandas,或者需要处理重复键时使用特定的处理方式。同时提醒用户注意数据清洗和类型转换,确保转换过程顺利。</think>以下是将二维数据转换为字典的5种典型方法及最佳实践,涵盖基础操作到高级处理: --- ### 一、基础转换方法 #### 1. 行列式转换(适合两列数据) ```python data = [ [&#39;苹果&#39;, 9.9], [&#39;香蕉&#39;, 3.5], [&#39;橙子&#39;, 6.8] ] # 方法1:字典推导式 fruit_dict = {row[0]: row[1] for row in data} # 输出:{&#39;苹果&#39;: 9.9, &#39;香蕉&#39;: 3.5, &#39;橙子&#39;: 6.8} # 方法2:使用zip函数 keys, values = zip(*data) fruit_dict = dict(zip(keys, values)) ``` #### 2. 多列数据转换(嵌套字典) ```python data = [ [101, &#39;手机&#39;, 2999], [102, &#39;电脑&#39;, 6999], [103, &#39;平板&#39;, 3999] ] product_dict = { row[0]: {&#39;name&#39;: row[1], &#39;price&#39;: row[2]} for row in data } # 输出:{101: {&#39;name&#39;: &#39;手机&#39;, &#39;price&#39;: 2999}, ...} ``` --- ### 二、进阶处理技巧 #### 1. 处理重复键值(使用集合) ```python from collections import defaultdict data = [ [&#39;北京&#39;, 2154], [&#39;上海&#39;, 2487], [&#39;北京&#39;, 2199], [&#39;广州&#39;, 1863] ] city_dict = defaultdict(list) for city, value in data: city_dict[city].append(value) # 输出:{&#39;北京&#39;: [2154, 2199], &#39;上海&#39;: [2487], ...} ``` #### 2. 行列转置转换 ```python data = [ [&#39;姓名&#39;, &#39;年龄&#39;, &#39;性别&#39;], [&#39;张三&#39;, 25, &#39;男&#39;], [&#39;李四&#39;, 28, &#39;女&#39;] ] # 转置后生成列字典 transposed = list(zip(*data)) column_dict = {transposed[0][i]: list(transposed[i][1:]) for i in range(len(transposed))} # 输出:{&#39;姓名&#39;: [&#39;张三&#39;, &#39;李四&#39;], &#39;年龄&#39;: [25, 28], ...} ``` --- ### 三、Pandas专业处理 ```python import pandas as pd # 创建DataFrame df = pd.DataFrame({ &#39;id&#39;: [101, 102, 103], &#39;product&#39;: [&#39;手机&#39;, &#39;电脑&#39;, &#39;平板&#39;], &#39;stock&#39;: [50, 20, 35] }) # 转换为字典的不同格式 dict1 = df.set_index(&#39;id&#39;).to_dict(&#39;index&#39;) # 输出:{101: {&#39;product&#39;: &#39;手机&#39;, &#39;stock&#39;: 50}, ...} dict2 = df.to_dict(&#39;records&#39;) # 输出:[{&#39;id&#39;:101, &#39;product&#39;:&#39;手机&#39;, ...}, ...] ``` --- ### 四、异常处理方案 ```python data = [ [&#39;A&#39;, 100], [&#39;B&#39;, 200], [&#39;A&#39;, 300], # 重复键 [&#39;C&#39;] # 数据不全 ] result = {} for row in data: try: key = row[0] value = row[1] # 处理重复键 if key in result: if isinstance(result[key], list): result[key].append(value) else: result[key] = [result[key], value] else: result[key] = value except IndexError: print(f"数据不完整: {row}") ``` --- ### 五、性能优化建议 1. **数据量级参考**: - 10万行以下:直接使用字典推导式 - 10万行以上:推荐使用pandas处理 - 1亿行级别:使用Dask库分布式处理 2. **内存优化技巧**: ```python # 使用生成器处理大文件 def csv_generator(file_path): with open(file_path, &#39;r&#39;) as f: reader = csv.reader(f) next(reader) # 跳过标题 for row in reader: yield row big_dict = {} for row in csv_generator(&#39;big_data.csv&#39;): key = row[0] big_dict[key] = row[1:] ``` --- ### 最佳实践选择指南 | 场景 | 推荐方法 | 优点 | |------|----------|------| | 简单键值对 | 字典推导式 | 代码简洁 | | 带表头数据 | pandas.to_dict | 自动处理列名 | | 重复键处理 | defaultdict | 自动合并数据 | | 流式大数据 | 生成器+yield | 节省内存 | | 需要行列转换 | zip转置 | 快速维度转换 | 通过选择合适的方法,可以高效实现二维数据到字典的转换,同时处理各种边界情况。实际应用中建议先进行数据清洗,确保键的唯一性和数据完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值