一.项目简单介绍
我们获取字段的内容方式有很多种,但基本都要ctrl+c(复制)ctrl+v粘贴,然后还有手动去更改
而以python作为处理工具将会快很多,本项目需要安装的库:MySQLdb,pandas,numpy
比如我们想要在每个不同的值加上"" 而复制的数据为下图
那么我们每次都要在每行字段之间加上""和,非常的麻烦,那么如何处理这种将他转换为字符串列表的形式,并将列表属性去掉.
二.内容加符号格式化输出解决方案
1.导入库,as后面为别名
import MySQLdb
import pandas as pd
import numpy as np
2.pandas读取文件数据:
E:/py/txt/var.txt为我存放数据内容的表,其内容为sql中提取表中品牌字段中不同的值,原表为京东手机一年的销售数据:
# 导入文件,并设置index_col=None,
df = pd.read_csv('E:/py/txt/var.txt', index_col=None, engine='python', names=['品牌'])
print(df)
此时数据类型为DataFrame,为二维表
其中属性index_col值有三种,整数型,序列,布尔(默认为None)
index_col=None 列为index的值,即列使用默认索引 0 1 2 3....
index_col=0 第一列为index值,即此时第一列内容作为索引
运行结果如下:
品牌
0 vivo
1 荣耀
2 小米
3 Apple
4 纽曼
5 华为
6 realme
7 oppo
8 三星
9 努比亚
10 一加
11 魅族
12 摩托罗拉
13 其它
14 酷派
15 朵唯
16 诺基亚
17 中兴
18 飞利浦
19 尼凯恩
20 天语
21 酷比
22 糖果
23 金立
24 nzone
25 黑鲨
# 将DataFrame格式转换为数组
array = np.array(df)
3.循环遍历输出并格式化输出
range(1, 26)若超出此范围会报错提示超出索引范围,但是不影响运行结果
IndexError: index 26 is out of bounds for axis 0 with size 26
for i in range(1, 26):s = df[i-1:i]array[i] = np.array(s)print(f"%c{str(*array[i])}%c," % (34, 34))
其中s=df[i-1:i]为循环输出df中每一条数据,类似series的索引输出
array[i] = np.array(s),将数据循环转换为数组并赋值
%c为格式化输出字符 并以ASCII码值为34的输出 % (34,34)
以列表形式输出:
# 数组转列表
a_list = array.tolist()
print(a_list)
[['vivo'], ['vivo'], ['荣耀'], ['小米'], ['Apple'], ['纽曼'], ['华为'], ['realme'], ['oppo'], ['三星'], ['努比亚'], ['一加 '], ['魅族'], ['摩托罗拉'], ['其它'], ['酷派'], ['朵唯'], ['诺基亚'], ['中兴 '], ['飞利浦 '], ['尼凯恩'], ['天语'], ['酷比'], ['糖果'], ['金立'], ['nzone']]
三.Mysqldb库解决数据库提取数据复杂的问题
1.要有相关库,上面已经提到了
2.以下为数据库输出代码
# 打开数据库连接
db = MySQLdb.connect("localhost", "root", "489000", "test", charset='utf8')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取一条数据
version = cursor.fetchone()
print("Database version : %s " % version)
# 循环下标
# Sql预处理语句分组并查询各个品牌
sql = """SELECT 品牌 FROM SHEET1 \GROUP BY 品牌 """
cursor.execute(sql)
for i in range(1, 10000):data = cursor.fetchone()if data is None:breakelse:print(*data) # 解包输出
# 关闭数据库连接
db.close()
3.循环时为了确保读数完整range范围可以设置大一些,然后在此基础上添加判断条件,
将循环游标读入的数据赋值给data,如果此种为None则终止循环,即再无数据可读,就终止循环并输出,为了保证输出格式为纯数据用*data解包此变量
四.整个过程完整代码及比对:
# _*_ coding:utf-8 _*_
# @Time : 2022/9/1 9:30
# @Author : ice_Seattle
# @File : testprogram.py
# @Software: PyCharmimport MySQLdb
import pandas as pd
import numpy as np
# 打开数据库连接
db = MySQLdb.connect("localhost", "root", "489000", "test", charset='utf8')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取一条数据
version = cursor.fetchone()
print("Database version : %s " % version)
# 循环下标
# Sql预处理语句分组并查询各个品牌
sql = """SELECT 品牌 FROM SHEET1 \GROUP BY 品牌 """
cursor.execute(sql)
for i in range(1, 10000):data = cursor.fetchone()if data is None:breakelse:print(*data) # 解包输出
# 关闭数据库连接
db.close()
# 导入文件,并设置index_col=None,
df = pd.read_csv('E:/py/txt/var.txt', index_col=None, engine='python', names=['品牌'])
# 将DataFrame格式转换为数组
array = np.array(df)
for i in range(1, 26):s = df[i-1:i]array[i] = np.array(s)print(f"%c{str(*array[i])}%c," % (34, 34))
# 数组转列表
a_list = array.tolist()
print(a_list)
Navicat 运行 SELECT 品牌,count(品牌) from sheet1 group by 品牌结果如下:
Kettle中spoon.bat运行程序test结果如下
五.总结
综上,若想提取字段中不同的内容:写好python代码之间运行后要比Navicat和Kettle快的多,且可以加上" "号用于列表等其它的数据转换,减少了复杂的操作步骤.