学python的第十九天

devtools/2024/9/20 9:20:36/ 标签: 网络, tcp/ip, 服务器, python

网络通信和访问数据库

1.1 基本的网络知识

@TCP/IP

       IP是低级的路由协议,它将数据拆分在许多小的数据包中,并通过网络将他们发送到某一特定地址,但无法保证所有包都抵达目的地,也不能保证包按顺序抵达

       TCP(传输控制协议),是一种高层协议,是面向连接的可靠数据传输协议,数据包未收到,会重发,并对数据包进行准确性检查,保证数据包按顺序抵达。

@IP地址,IPv4和IPv6

       特殊IP地址,127.0.0.1回送地址,只进行本机进程间通信,不进行任何网络传输

@端口(范围:0~65535,小于1024的保留给预定义的服务,如HTTP,80    FTP,20/21   Telnet,23   Email,25等等)

       网络通信程序运行提供网络服务或进行通信,需要不同的端口号进行通信,不仅要指定IP地址,还要指定端口号

@HTTP(端口80)/HTTPS(端口443)

HTTP(超文本传输协议)

HTTP/1.1共定义了8种请求方法,GET和POST方法最常用

HTTPS(超文本传输安全协议):HTTP+SSL,用于提供加密通信及对网络服务器身份的鉴定

1.2 搭建自己的Web服务器

1,安装JDK(java开发工具包)

2,配置java运行环境

3,安装Apache Tomcat服务器

4,启动Apache Tomcat服务器

1.3 urllib.request模块

1,发送GET请求

python"># 发送GET请求,获取响应
import urllib.request  # 导入urllib.request模块url = 'http://www.baidu.com/?action=query&ID=10'   # 请求URL网址,?后的内容是请求参数,多个参数用&分隔,例如action是参数名,query是参数值req = urllib.request.Request(url)  # 创建一个请求对象,默认是GET请求with urllib.request.urlopen(req) as response:  # 发送请求,并获取响应对象,可是使用with as代码块管理和释放data = response.read()      # 读取数据,为字节序列数据json_data = data.decode()   # 将字节序列数据转换为字符串print(json_data)   # 输出字符串数据
2,发送POST请求,提交数据
python"># 发送POST请求,提交数据import urllib.request  # 导入urllib.request模块url = 'http://www.baidu.com/'# 准备HTTP参数
params_dict = {'action': 'query', 'ID': '10'}
params_str = urllib.parse.urlencode(params_dict)  # 将字典转换为URL参数字符串
print(params_str)# 字符串转换为字节序列数据
params_bytes = params_str.encode()# 创建一个请求对象,设置请求方法为POST
req = urllib.request.Request(url, data=params_bytes)  # 发送POST请求,并设置请求方法为POSTwith urllib.request.urlopen(req) as response:  # 发送请求,并获取响应对象,可使用with as代码块管理和释放data = response.read()      # 读取数据,为字节序列数据json_data = data.decode()   # 将字节序列数据转换为字符串print(json_data)   # 输出字符串数据

1.4 JSON数据 

JSON(JavaScript Object Notation)

构成JSON文档的两种结构为:JSON对象(object)和JSON数组(array)

@1.4.1 JSON对象类似于python中的字典类型

JSON数据中的解码(decode)指将JSON数据转换为python数据,当从网络中接收或从磁盘中读取JSON数据时,需要将其解码为Python数据

{

"name": "a.htm",

"size": "345",

"saved": "true"

}

@1.4.2 JSON数组类似于python中的列表类型,示例如下:

    "text","html","css"

]

@1.4.3 JSON的数值有字符串,数字,true,false,null,对象或数组。null表示空的对象,而且对象和数组可以嵌套

@1.4.4 使用json模块提供的loads(str)函数进行JSON数据的解码,参数str是JSON字符串,返回python数据。

代码示例:

python">import urllib.request  # 导入urllib.request模块
import json    # 导入json模块url = 'http://www.baidu.com/?action=query&ID=10'   # 请求URL网址,?后的内容是请求参数,多个参数用&分隔,例如action是参数名,query是参数值req = urllib.request.Request(url)  # 创建一个请求对象,默认是GET请求with urllib.request.urlopen(req) as response:  # 发送请求,并获取响应对象,可是使用with as代码块管理和释放data = response.read()      # 读取数据,为字节序列数据json_data = data.decode()   # 将字节序列数据转换为字符串print('JSON字符串:', json_data)   # 输出字符串数据py_dict = json.load(json_data)   # 解码json字符串,返回字典print('备忘录ID:', py_dict['ID'])print('备忘录日期:', py_dict['CDate'])print('备忘录内容:', py_dict['Content'])print('用户ID:', py_dict['UserID'])

@1.4.5 下载图片示例

python"># 1.4 下载图片示例
import urllib.request  # 导入urllib.request模块url = 'http://www.baidu.com/img/logo.png'req = urllib.request.Request(url)  # 创建一个请求对象,默认是GET请求with urllib.request.urlopen(req) as response:  # 发送请求,并获取响应对象,可使用with as代码块管理和释放data = response.read()  # 读取数据,为字节序列数据f_name = 'logo.png'  # 文件名with open(f_name, 'wb') as f:  # 创建文件对象,并设置写入模式,wb表示写入二进制数据f.write(data)  # 将字节序列数据写入文件print('图片下载完成')

@1.4.6 返回所有备忘录信息示例

python"># 1.5 返回所有备忘录信息
import urllib.request  # 导入urllib.request模块
import jsonurl = 'http://www.baidu.com/'  # 请求URL网址req = urllib.request.Request(url)  # 创建一个请求对象,默认是GET请求with urllib.request.urlopen(req) as response:  # 发送请求,并获取响应对象,可是使用with as代码块管理和释放data = response.read()  # 读取数据,为字节序列数据json_data = data.decode()  # 将字节序列数据转换为字符串py_dict = json.load(json_data)  # 解码json字符串,返回字典record_array = py_dict['Record']  # 获取备忘录数组for record_obj in record_array:print('--------备忘录信息--------')print('备忘录ID:', record_obj['ID'])print('备忘录日期:', record_obj['CDate'])print('备忘录内容:', record_obj['Content'])print('用户ID:', record_obj['UserID'])

2.1 SQLite数据库 

SQLite是嵌入式系统使用的关系数据库,目前的主流版本是SQLite 3。SQLite是开源的,采用C语言编写而成,具有可移植性强、可靠性高 、小而易用等特点。SQLite提供了对SQL-92标准的支持,支持多表、索引、事务、视图和触发。

@2.1.1 SQLite的数据类型,是无数据类型的数据库

支持的数据类型:

INTEGER(有符号的整数类型)

REAL(浮点类型)

TEXT(字符串类型,采用UTF-8,UTF-16)

BLOB(二进制大对象类型,能够存放任意二进制数据)

@2.1.2  Python数据类型与SQLite数据类型的映射

Python数据类型SQLite数据类型
NoneNULL
intINTEGRE
floatREAL
strTEXT
bytesBLOB

 @2.1.3 使用GUI管理工具管理SQLite数据库

如DB Browser for SQLite。

自行下载安装,打开后如下图

1. 创建数据库

2.创建数据表

3.执行SQL语句

4.浏览数据 

 2.2 数据库编程的基本操作

数据库编程主要分为两类:查询(Read)和修改(C插入,U更新,D删除)

查询数据和修改数据

2.3 sqlite3模块API(使用此模块访问数据库)

@ 2.3.1 数据库连接对象Connection

访问第一步是数据库连接

通过connect(database)函数建立数据库连接,参数database是SQLite数据库的文件路径,连接成功,返回数据库连接对象Connection。

Connection有如下重要方法:

close()关闭数据库连接,关闭之后再使用数据库连接将引发异常

commit()提交数据库事务

rollback()回滚数据库事务

cursor()获得Cursor游标对象

@ 2.3.2 游标对象Cursor

一个Cursor游标对象表示一个数据库游标,游标暂时保存了SQL操作所影响到的数据。游标是通过数据库连接创建的。

游标Cursor对象有很多方法和属性,其中的基本SQL操作方法如下:

execute(sql[,parameters]):执行一条SQL语句,sql是SQL语句 ,parameters是为SQL提供的参数,可以是序列或字典类型。返回值是 整数,表示执行SQL语句影响的行数。

executemany(sql[,seq_of_params]):执行批量SQL语句,sql是S QL语句,seq_of_params是为SQL提供的参数,seq_of_params是序列。 返回值是整数,表示执行SQL语句影响的行数。

在通过execute()和executemany()方法执行SQL查询语句后, 还要通过提取方法从查询结果集中返回数据,相关提取方法如下:

fetchone():从结果集中返回只有一条记录的序列,如果没有数 据,则返回None。

fetchmany(size=cursor.arraysize):从结果集中返回小于等于size 记录数的序列,如果没有数据,则返回空序列,size在默认情况下是整 个游标的行数。

fetchall():从结果集中返回所有数据。

2.4 数据库的CRUD操作示例

@2.4.1 数据插入(Creat)

 数据插入操作的SQL语句INSERT,代码如下:

python">import sqlite3  # 导入sqlite3模块
import os# 数据库文件路径
db_path = r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db'# 检查文件是否存在
if not os.path.exists(db_path):print(f"数据库文件 {db_path} 不存在!")
i_name = input('请输入姓名:')  # 获取用户输入的姓名
i_sex = input('请输入性别(1表示男,0表示女):')  # 获取用户输入的性别
i_birthday = input('请输入生日(YYYYMMDD):')  # 获取用户输入的生日try:# 连接到SQLite数据库con = sqlite3.connect(r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db')# 创建一个Cursor对象,用于执行SQL命令cursor = con.cursor()# 执行SQL查询操作sql = 'INSERT INTO  student(s_name, s_sex, s_birthday) VALUES (?, ?, ?)'cursor.execute(sql, [i_name, i_sex, i_birthday])  # 执行SQL命令,参数放到序列或元组中# 提取数据库事务con.commit()print('插入成功!')except sqlite3.Error as e:print('插入数据失败:{}'.format(e))# 回滚数据库事务con.rollback()finally:# 关闭游标if cursor:cursor.close()# 关闭数据库连接if con:con.close()

@2.4.2 数据查询(Read)

SQL查询语句是SELECT,根据是否带有WHERE子句,分为:无条件查询和有条件查询

***********无条件查询,没有WHERE子句**********,代码如下:

python">import sqlite3  # 导入sqlite3模块
import os# 数据库文件路径
db_path = r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db'# 检查文件是否存在
if not os.path.exists(db_path):print(f"数据库文件 {db_path} 不存在!")try:# 连接到SQLite数据库con = sqlite3.connect(r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db')# 创建一个Cursor对象,用于执行SQL命令cursor = con.cursor()# 执行SQL查询操作sql = 'SELECT s_id, s_name, s_sex, s_birthday FROM student'cursor.execute(sql)  # 执行SQL命令# 提取结果集result_set = cursor.fetchall()for row in result_set:print('学号:{0} - 姓名:{1} - 性别:{2} - 生日:{3}'.format(row[0], row[1], row[2], row[3]))except sqlite3.Error as e:print('数据库查询发生错误:{}'.format(e))finally:# 关闭游标if cursor:cursor.close()# 关闭数据库连接if con:con.close()

 *************有条件查询**************有WHERE子句,WHERE子句是查询条件,

代码如下:

python"># 有条件查询,有WHERE子句,WHERE自己是查询条件
import sqlite3  # 导入sqlite3模块
import os# 数据库文件路径
db_path = r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db'# 检查文件是否存在
if not os.path.exists(db_path):print(f"数据库文件 {db_path} 不存在!")istr = input('请输入生日(YYYYMMDD):')  # 获取用户输入的生日try:# 连接到SQLite数据库con = sqlite3.connect(r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db')# 创建一个Cursor对象,用于执行SQL命令cursor = con.cursor()# 执行SQL查询操作sql = 'SELECT s_id, s_name, s_sex, s_birthday FROM student WHERE s_birthday < ?'  # 查询学生信息cursor.execute(sql, [istr])  # 执行SQL命令,参数放到序列或元组中# 提取结果集result_set = cursor.fetchall()for row in result_set:print('学号:{0} - 姓名:{1} - 性别:{2} - 生日:{3}'.format(row[0], row[1], row[2], row[3]))except sqlite3.Error as e:print('数据库查询发生错误:{}'.format(e))finally:# 关闭游标if cursor:cursor.close()# 关闭数据库连接if con:con.close()

@2.4.3 数据更新(Update)

数据更新操作的SQL语句是UPDATE。示例如下:

python">import sqlite3  # 导入sqlite3模块
import os# 数据库文件路径
db_path = r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db'# 检查文件是否存在
if not os.path.exists(db_path):print(f"数据库文件 {db_path} 不存在!")
i_id = input('请输入学号:')  # 获取用户输入的学号
i_name = input('请输入姓名:')  # 获取用户输入的姓名
i_sex = input('请输入性别(1表示男,0表示女):')  # 获取用户输入的性别
i_birthday = input('请输入生日(YYYYMMDD):')  # 获取用户输入的生日try:# 连接到SQLite数据库con = sqlite3.connect(r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db')# 创建一个Cursor对象,用于执行SQL命令cursor = con.cursor()# 执行SQL查询操作sql = 'UPDATE  student SET s_name=?, s_sex=?, s_birthday=? WHERE s_id=?'cursor.execute(sql, [i_name, i_sex, i_birthday, i_id])  # 执行SQL命令,参数放到序列或元组中# 提取数据库事务con.commit()print('更新数据库成功')except sqlite3.Error as e:print('更新数据库失败:{}'.format(e))# 回滚数据库事务con.rollback()finally:# 关闭游标if cursor:cursor.close()# 关闭数据库连接if con:con.close()

@2.4.4数据删除(Delete)

数据删除操作SQL语句是DELETE。示例如下:

python">import sqlite3  # 导入sqlite3模块
import os# 数据库文件路径
db_path = r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db'# 检查文件是否存在
if not os.path.exists(db_path):print(f"数据库文件 {db_path} 不存在!")
i_id = input('请输入要删除学生的学号:')  # 获取学号try:# 连接到SQLite数据库con = sqlite3.connect(r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db')# 创建一个Cursor对象,用于执行SQL命令cursor = con.cursor()# 执行SQL查询操作sql = 'DELETE  FROM student  WHERE s_id=?'cursor.execute(sql, [i_id])  # 执行SQL命令,参数放到序列或元组中# 提取数据库事务con.commit()print('删除数据成功')except sqlite3.Error as e:print('删除数据失败:{}'.format(e))# 回滚数据库事务con.rollback()finally:# 关闭游标if cursor:cursor.close()# 关闭数据库连接if con:con.close()

可以看到下图s_id=5的学生张三被删除 

2.5 防止 SQL注入攻击

示例如下:

python">import sqlite3  # 导入sqlite3模块
import os# 数据库文件路径
db_path = r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db'# 检查文件是否存在
if not os.path.exists(db_path):print(f"数据库文件 {db_path} 不存在!")istr = input('请输入生日(YYYYMMDD):')  # 获取用户输入的生日try:# 连接到SQLite数据库con = sqlite3.connect(r'D:\桌面文件\DB\新建数据库的相关文件\school_db.db')# 创建一个Cursor对象,用于执行SQL命令cursor = con.cursor()# 执行SQL查询操作
#    sql = 'SELECT s_id, s_name, s_sex, s_birthday FROM student WHERE s_birthday < ?'  # 查询学生信息
#    cursor.execute(sql, [istr])  # 执行SQL命令,参数放到序列或元组中sql = 'SELECT s_id, s_name, s_sex, s_birthday FROM student WHERE s_birthday < ' + istr  # 查询学生信息,这种方式容易造成,SQL注入攻击cursor.execute(sql)  # 执行SQL命令,参数放到序列或元组中# 提取结果集result_set = cursor.fetchall()for row in result_set:print('学号:{0} - 姓名:{1} - 性别:{2} - 生日:{3}'.format(row[0], row[1], row[2], row[3]))except sqlite3.Error as e:print('数据库查询发生错误:{}'.format(e))finally:# 关闭游标if cursor:cursor.close()# 关闭数据库连接if con:con.close()

图一是查询20050101之前的

图二SQL注入是查询所有数据,如果是删除,损失可想而知!!!! 


http://www.ppmy.cn/devtools/17926.html

相关文章

如何制作个性又美观的二维码?自定义Logo、样式,还能一键复用

草料二维码提供基础的二维码美化设置&#xff0c;包含Logo、颜色、码点码眼、容错、添加文字等设置。 还提供150标签样式&#xff0c;标签样式中所有内容&#xff0c;包括LOGO、背景、字段数量等&#xff0c;均可修改。 同时&#xff0c;支持将样式保存到账号下&#xff0c;方…

295. 数据流的中位数

295. 数据流的中位数 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。例如 arr [2,3,4] 的中位数是 3 。 例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类:MedianFinder() 初始…

博睿数据亮相GOPS全球运维大会,Bonree ONE 2024春季正式版发布!

2024年4月25日&#xff0c;博睿数据 Bonree ONE 2024 春季正式版焕新发布。同时&#xff0c;博睿数据AIOps首席专家兼产品总监贺安辉携核心产品新一代一体化智能可观测平台 Bonree ONE 亮相第二十二届 GOPS 全球运维大会深圳站。 Bonree ONE 2024 春季版产品重点升级数据采集、…

Docker数据卷的使用

1 数据卷概念 数据卷是一个共给容器使用的特殊文件目录&#xff0c;位于容器中&#xff0c;可以将宿主机的目录挂载到数据卷上&#xff0c;对数据卷的修改立刻可见&#xff0c;并且更新数据卷不会影响到容器的使用&#xff0c;从而实现数据在主机和容器之间共享。 2 创建数据…

Scala 04 —— Scala Puzzle 拓展

Scala 04 —— Scala Puzzle 拓展 文章目录 Scala 04 —— Scala Puzzle 拓展一、占位符二、模式匹配的变量和常量模式三、继承 成员声明的位置结果初始化顺序分析BMember 类BConstructor 类 四、缺省初始值与重载五、Scala的集合操作和集合类型保持一致性第一部分代码解释第二…

C语言——贪吃蛇游戏的实现

目录 一. 贪吃蛇的介绍 二. Win32 API 1. 控制台程序 2. COORD 控制台屏幕上的坐标 3. GetStdHandle 4. GetConsoleCursorInfo CONSOLE_CURSOR_INFO 5. SetConsoleCursorInfo 6. SetConsoleCursorPosition 封装的SetPos函数 7. GetAsyncKeyState 宏定义KEY_PRESS 三…

C++感受6-Hello World 交互版

变量、常量输入、输出、流getline() 函数读入整行输入Hello() 函数复习新定义函数 Input() 实现友好的人机交互还有 “痘痘” 为什么挤不到的分析…… 1. DRY 原则简介 上一节课&#xff0c;我们写了两版“问候”程序。第一版的最大问题是重复的内容比较多&#xff0c;每一次问…

C++ 核心编程(1)

c面向对象编程 1.内存分区模型 程序运行前为代码区和全局区。程序运行后才有栈区和堆区。。 1.1 程序运行前 #include<iostream> #include <bits/stdc.h> using namespace std; /*全局区全局变量、静态变量、常量 */ //全局变量 int g_1 20; int g_2 30; //const…

在Go项目中使用ELK进行日志采集

在当今企业级应用开发中&#xff0c;日志管理和分析是非常重要的部分。ELK Stack&#xff08;Elasticsearch、Logstash、和Kibana&#xff09;是一套广泛使用的开源工具&#xff0c;用于日志的收集、存储、搜索、分析与可视化。本文将深入解析如何在Go项目中实现ELK日志采集&am…

基于Python实现的推箱子小游戏

Python贪吃蛇小游戏实现: 推箱子曾经在我们的童年给我们带来了很多乐趣。推箱子这款游戏现在基本上没人玩了&#xff0c;甚至在新一代人的印象中都已毫无记忆了。。。但是&#xff0c;这款游戏可以在一定程度上锻炼自己的编程能力。 运行效果如图所示&#xff1a; 游戏关卡有点…

Cache缓存

在计算机架构中&#xff0c;缓存&#xff08;Cache&#xff09;是一种高速数据存储层&#xff0c;它存储了一部分从原始数据源&#xff08;如主内存&#xff09;频繁访问的数据副本。通过将数据暂时存储在物理上更接近处理器的位置&#xff0c;缓存能够减少数据访问的延迟&…

Qt下使用OpenCV截取图像并在QtableWidget表格上显示

文章目录 前言一、在QLabel上显示图片并绘制矩形框二、保存矩形框数据为CSV文件三、保存截取图像四、将截取图像填充到表格五、图形视图框架显示图像六、示例完整代码总结 前言 本文主要讲述了在Qt下使用OpenCV截取绘制的矩形框图像&#xff0c;并将矩形框数据保存为CSV文件&a…

苹果一次性开源了8个大模型! 包含模型权重、训练日志和设置,OpenELM全面开源

不以开放性著称的苹果居然同时开源了大模型的权重、训练和评估框架&#xff0c;涵盖训练日志、多个保存点和预训练设置。同时升级计算机视觉工具包 CVNets 为 CoreNet&#xff01;支持 OpenELM&#xff01; ▲图1.由Stable Diffusion3生成。 OpenELM是Apple苹果公司最新推出的…

前端学习笔记3

列表、表格与表单​ 列表就是信息资源的一种展示形式。它可以使信息结构化和条理化,并以列表的样式显示出来,以便浏览者能更快捷地获得相应的信息。 3.0 代码访问地址 https://gitee.com/qiangge95243611/java118/tree/master/web/day03 3.1 列表 ​ 列表大致可以分为3类…

Flutter开发之--初识Flutter

文章目录 概述Flutter整体架构嵌入层引擎层框架层 跑通demo尝鲜Flutter项目的目录介绍Flutter demo项目的运行 总结 概述 Flutter 是由Google公司研发的一种跨端开发技术&#xff0c;在2018年正式推出。Flutter自带Skia图形绘制引擎&#xff0c;采用自绘制的方式&#xff0c;不…

基于SpringBoot开发的同城租房系统租房软件APP小程序源码

项目背景 一、市场前景 随着城市化进程的加快和人口流动性的增强&#xff0c;租房市场正逐渐成为一个不可忽视的巨大市场。传统的租房方式往往存在着信息不对称、效率低下等问题&#xff0c;而同城租房软件的出现&#xff0c;则有效地解决了这些问题&#xff0c;为租房市场注…

Leetcode-168.Excel表列名称

题目描述 给你一个整数 columnNumber &#xff0c;返回它在 Excel 表中相对应的列名称。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...示例 1&#xff1a; 输入&#xff1a;columnNumber 1 输出&#xff1a;"A"…

DDR3 MIG IP核解决方案

DDR3 MIG IP核解决方案 信号方向描述app_addr [ADDR_WIDTH - 1&#xff1a;0]输入该输入指示当前请求的地址。app_cmd [2&#xff1a;0]输入该输入选择当前请求的命令。app_en输入这是app_addr []&#xff0c;app_cmd [2&#xff1a;0]&#xff0c;app_sz和app_hi_pri输入的高…

BGP的基本配置

l 按照以下步骤配置BGP协议&#xff1a; 第1步&#xff1a;设备基本参数配置&#xff0c;AS内配置IGP确保内部网络连通性&#xff1b; l 配置IGP&#xff08;OSPF协议等&#xff09;路由解决peer对等体的源和目标IP之间连通性&#xff0c;确保peer之间TCP&#xff08;179&a…

故障诊断 | 基于迁移学习和SqueezeNet 的滚动轴承故障诊断(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 将一维轴承振动信号转换为二维尺度图&#xff08;时频谱图&#xff09;&#xff0c;并使用预训练网络应用迁移学习对轴承故障进行分类。 迁移学习显著减少了传统轴承诊断方法特征提取和特征选择所花费的时间&#xff…