一篇文章教你自动化测试如何解析excel文件?

前言

自动化测试中我们存放数据无非是使用文件或者数据库,那么文件可以是csv,xlsx,xml,甚至是txt文件,通常excel文件往往是我们的首选,无论是编写测试用例还是存放测试数据,excel都是很方便的。那么今天我们就把不同模块处理excel文件的方法做个总结,直接做封装,方便我们以后直接使用,增加工作效率。

一、openpyxl

openpyxl是个第三方库,首先我们使用命令 pip install openpyxl 直接安装

注:openpyxl操作excel时,行号和列号都是从1开始计算的

封装代码

"""
from openpyxl import load_workbook
from openpyxl.styles import Font
from openpyxl.styles.colors import BLACK
from collections import namedtuple
class ParseExcel(object):
    """解析excel文件"""
    def __init__(self, filename, sheet_name=None):
        try:
            self.filename = filename
            self.sheet_name = sheet_name
            self.wb = load_workbook(self.filename)
            if self.sheet_name is None:
                self.work_sheet = self.wb.active
            else:
                self.work_sheet = self.wb[self.sheet_name]
        except FileNotFoundError as e:
            raise e
    def get_max_row_num(self):
        """获取最大行号"""
        max_row_num = self.work_sheet.max_row
        return max_row_num
    def get_max_column_num(self):
        """获取最大列号"""
        max_column = self.work_sheet.max_column
        return max_column
    def get_cell_value(self, coordinate=None, row=None, column=None):
        """获取指定单元格的数据"""
        if coordinate is not None:
            try:
                return self.work_sheet[coordinate].value
            except Exception as e:
                raise e
        elif coordinate is None and row is not None and column is not None:
            if isinstance(row, int) and isinstance(column, int):
                return self.work_sheet.cell(row=row, column=column).value
            else:
                raise TypeError('row and column must be type int')
        else:
            raise Exception("Insufficient Coordinate of cell!")
    def get_row_value(self, row):
        """获取某一行的数据"""
        column_num = self.get_max_column_num()
        row_value = []
        if isinstance(row, int):
            for column in range(1, column_num + 1):
                values_row = self.work_sheet.cell(row, column).value
                row_value.append(values_row)
            return row_value
        else:
            raise TypeError('row must be type int')
    def get_column_value(self, column):
        """获取某一列数据"""
        row_num = self.get_max_column_num()
        column_value = []
        if isinstance(column, int):
            for row in range(1, row_num + 1):
                values_column = self.work_sheet.cell(row, column).value
                column_value.append(values_column)
            return column_value
        else:
            raise TypeError('column must be type int')
    def get_all_value_1(self):
        """获取指定表单的所有数据(除去表头)"""
        max_row_num = self.get_max_row_num()
        max_column = self.get_max_column_num()
        values = []
        for row in range(2, max_row_num + 1):
            value_list = []
            for column in range(1, max_column + 1):
                value = self.work_sheet.cell(row, column).value
                value_list.append(value)
            values.append(value_list)
        return values
    def get_all_value_2(self):
        """获取指定表单的所有数据(除去表头)"""
        rows_obj = self.work_sheet.iter_rows(min_row=2, max_row=self.work_sheet.max_row,
                                             values_only=True)  # 指定values_only 会直接提取数据不需要再使用cell().value
        values = []
        for row_tuple in rows_obj:
            value_list = []
            for value in row_tuple:
                value_list.append(value)
            values.append(value_list)
        return values
    def get_excel_title(self):
        """获取sheet表头"""
        title_key = tuple(self.work_sheet.iter_rows(max_row=1, values_only=True))[0]
        return title_key
    def get_listdict_all_value(self):
        """获取所有数据,返回嵌套字典的列表"""
        sheet_title = self.get_excel_title()
        all_values = self.get_all_value_2()
        value_list = []
        for value in all_values:
            value_list.append(dict(zip(sheet_title, value)))
        return value_list
    def get_list_nametuple_all_value(self):
        """获取所有数据,返回嵌套命名元组的列表"""
        sheet_title = self.get_excel_title()
        values = self.get_all_value_2()
        excel = namedtuple('excel', sheet_title)
        value_list = []
        for value in values:
            e = excel(*value)
            value_list.append(e)
        return value_list
    def write_cell(self, row, column, value=None, bold=True, color=BLACK):
        """
        指定单元格写入数据
        :param work_sheet:
        :param row: 行号
        :param column: 列号
        :param value: 待写入数据
        :param bold: 加粗, 默认加粗
        :param color: 字体颜色,默认黑色
        :return:
        """
        try:
            if isinstance(row, int) and isinstance(column, int):
                cell_obj = self.work_sheet.cell(row, column)
                cell_obj.font = Font(color=color, bold=bold)
                cell_obj.value = value
                self.wb.save(self.filename)
            else:
                raise TypeError('row and column must be type int')
        except Exception as e:
            raise e
if __name__ == '__main__':
    pe = ParseExcel('testdata.xlsx')
    # sheet = pe.get_sheet_object('testcase')
    column_row = pe.get_max_column_num()
    print('最大列号:', column_row)
    max_row = pe.get_max_row_num()
    print('最大行号:', max_row)
    #
    cell_value_1 = pe.get_cell_value(row=2, column=3)
    print('第%d行, 第%d列的数据为: %s' % (2, 3, cell_value_1))
    cell_value_2 = pe.get_cell_value(coordinate='A5')
    print('A5单元格的数据为: {}'.format(cell_value_2))
    value_row = pe.get_row_value(3)
    print('第{}行的数据为:{}'.format(3, value_row))
    value_column = pe.get_column_value(2)
    print('第{}列的数据为:{}'.format(2, value_column))
    #
    values_1 = pe.get_all_value_1()
    print('第一种方式获取所有数据\n', values_1)
    values_2 = pe.get_all_value_2()
    print('第二种方式获取所有数据\n', values_2)
    title = pe.get_excel_title()
    print('表头为\n{}'.format(title))
    dict_value = pe.get_listdict_all_value()
    print('所有数据组成的嵌套字典的列表:\n', dict_value)
    #
    namedtuple_value = pe.get_list_nametuple_all_value()
    print('所有数据组成的嵌套命名元组的列表:\n', namedtuple_value)
    pe.write_cell(1, 2, 'Tc_title')

上面这个封装如如果用来同时操作同一个excel文件的两个sheet写入数据时,会有点小bug(写完后你会发现两个表单有一个是没有数据的)

其实原因很简单:不同对象拥有自己独立的属性, 当你写操作的时候其实每个对象只针对自己的表单做了保存,所以最后一个对象写完数据后,只保存了自己的表单,其他的对象的表单实际是没有保存的。针对这个问题,对上面封装的代码进行了轻微改动

"""
from openpyxl import load_workbook
from openpyxl.styles import Font
from openpyxl.styles.colors import BLACK
from collections import namedtuple
 
 
class ParseExcel(object):
    """解析excel文件"""
 
    def __init__(self, filename):
        try:
            self.filename = filename
            self.__wb = load_workbook(self.filename)
        except FileNotFoundError as e:
            raise e
 
    def get_max_row_num(self, sheet_name):
        """获取最大行号"""
        max_row_num = self.__wb[sheet_name].max_row
        return max_row_num
 
    def get_max_column_num(self, sheet_name):
        """获取最大列号"""
        max_column = self.__wb[sheet_name].max_column
        return max_column
 
    def get_cell_value(self, sheet_name, coordinate=None, row=None, column=None):
        """获取指定单元格的数据"""
        if coordinate is not None:
            try:
                return self.__wb[sheet_name][coordinate].value
            except Exception as e:
                raise e
        elif coordinate is None and row is not None and column is not None:
            if isinstance(row, int) and isinstance(column, int):
                return self.__wb[sheet_name].cell(row=row, column=column).value
            else:
                raise TypeError('row and column must be type int')
        else:
            raise Exception("Insufficient Coordinate of cell!")
 
    def get_row_value(self, sheet_name, row):
        """获取某一行的数据"""
        column_num = self.get_max_column_num(sheet_name)
        row_value = []
        if isinstance(row, int):
            for column in range(1, column_num + 1):
                values_row = self.__wb[sheet_name].cell(row, column).value
                row_value.append(values_row)
            return row_value
        else:
            raise TypeError('row must be type int')
 
    def get_column_value(self, sheet_name, column):
        """获取某一列数据"""
        row_num = self.get_max_column_num(sheet_name)
        column_value = []
        if isinstance(column, int):
            for row in range(1, row_num + 1):
                values_column = self.__wb[sheet_name].cell(row, column).value
                column_value.append(values_column)
            return column_value
        else:
            raise TypeError('column must be type int')
 
    def get_all_value_1(self, sheet_name):
        """获取指定表单的所有数据(除去表头)"""
        max_row_num = self.get_max_row_num(sheet_name)
        max_column = self.get_max_column_num(sheet_name)
        values = []
        for row in range(2, max_row_num + 1):
            value_list = []
            for column in range(1, max_column + 1):
                value = self.__wb[sheet_name].cell(row, column).value
                value_list.append(value)
            values.append(value_list)
        return values
 
    def get_all_value_2(self, sheet_name):
        """获取指定表单的所有数据(除去表头)"""
        rows_obj = self.__wb[sheet_name].iter_rows(min_row=2, max_row=self.__wb[sheet_name].max_row, values_only=True)
        values = []
        for row_tuple in rows_obj:
            value_list = []
            for value in row_tuple:
                value_list.append(value)
            values.append(value_list)
        return values
 
    def get_excel_title(self, sheet_name):
        """获取sheet表头"""
        title_key = tuple(self.__wb[sheet_name].iter_rows(max_row=1, values_only=True))[0]
        return title_key
 
    def get_listdict_all_value(self, sheet_name):
        """获取所有数据,返回嵌套字典的列表"""
        sheet_title = self.get_excel_title(sheet_name)
        all_values = self.get_all_value_2(sheet_name)
        value_list = []
        for value in all_values:
            value_list.append(dict(zip(sheet_title, value)))
        return value_list
 
    def get_list_nametuple_all_value(self, sheet_name):
        """获取所有数据,返回嵌套命名元组的列表"""
        sheet_title = self.get_excel_title(sheet_name)
        values = self.get_all_value_2(sheet_name)
        excel = namedtuple('excel', sheet_title)
        value_list = []
        for value in values:
            e = excel(*value)
            value_list.append(e)
        return value_list
 
    def write_cell(self, sheet_name, row, column, value=None, bold=True, color=BLACK):
        if isinstance(row, int) and isinstance(column, int):
            try:
                cell_obj = self.__wb[sheet_name].cell(row, column)
                cell_obj.font = Font(color=color, bold=bold)
                cell_obj.value = value
                self.__wb.save(self.filename)
            except Exception as e:
                raise e
        else:
            raise TypeError('row and column must be type int')
 
 
if __name__ == '__main__':
    pe = ParseExcel('testdata.xlsx')
    print(pe.get_all_value_2('division'))
    print(pe.get_list_nametuple_all_value('division'))
    column_row = pe.get_max_column_num('division')
    print('最大列号:', column_row)
    max_row = pe.get_max_row_num('division')
    print('最大行号:', max_row)
    cell_value_1 = pe.get_cell_value('division', row=2, column=3)
    print('第%d行, 第%d列的数据为: %s' % (2, 3, cell_value_1))
    cell_value_2 = pe.get_cell_value('division', coordinate='A5')
    print('A5单元格的数据为: {}'.format(cell_value_2))
    value_row = pe.get_row_value('division', 3)
    print('第{}行的数据为:{}'.format(3, value_row))
    value_column = pe.get_column_value('division', 2)
    print('第{}列的数据为:{}'.format(2, value_column))
    values_1 = pe.get_all_value_1('division')
    print('第一种方式获取所有数据\n', values_1)
    values_2 = pe.get_all_value_2('division')
    print('第二种方式获取所有数据\n', values_2)
    title = pe.get_excel_title('division')
    print('表头为\n{}'.format(title))
    dict_value = pe.get_listdict_all_value('division')
    print('所有数据组成的嵌套字典的列表:\n', dict_value)
    namedtuple_value = pe.get_list_nametuple_all_value('division')
    print('所有数据组成的嵌套命名元组的列表:\n', namedtuple_value)
    pe.write_cell('division', 1, 2, 'Tc_title')

二、xlrd

安装xlrd,此模块只支持读操作, 如果要写需要使用xlwt或者使用xlutils配合xlrd, 但是使用xlwt只能对新的excel文件进行写操作,无法对原有文件进行写, 所以这里选择使用xlutils

但是还有一个问题就是,如果使用xlutils, 那么我们的excel文件需要以.xls 为后缀。因为以xlsx为后缀无法实现写,会报错(亲测,因为formatting_info参数还没有对新版本的xlsx的格式完成兼容)

注:xlrd操作excel时,行号和列号都是从0开始计算的

封装代码

"""
import xlrd
from xlutils import copy
from collections import namedtuple
 
 
class ParseExcel(object):
    # xlrd 解析excel, 行号和列号都是从0开始的
    def __init__(self, filename, sheet):
        try:
            self.filename = filename
            self.sheet = sheet
            self.wb = xlrd.open_workbook(self.filename, formatting_info=True)
            if isinstance(sheet, str):
                self.sheet = self.wb.sheet_by_name(sheet)
            elif isinstance(sheet, int):
                self.sheet = self.wb.sheet_by_index(sheet)
            else:
                raise TypeError('sheet must be int or str')
        except Exception as e:
            raise e
 
    def get_max_row(self):
        """获取表单的最大行号"""
        max_row_num = self.sheet.nrows
        return max_row_num
 
    def get_max_column(self):
        """获取表单的最大列号"""
        min_row_num = self.sheet.ncols
        return min_row_num
 
    def get_cell_value(self, row, column):
        """获取某个单元格的数据"""
        if isinstance(row, int) and isinstance(column, int):
            values = self.sheet.cell(row-1, column-1).value
            return values
        else:
            raise TypeError('row and column must be type int')
 
    def get_row_values(self, row):
        """获取某一行的数据"""
        if isinstance(row, int):
            values = self.sheet.row_values(row-1)
            return values
        else:
            raise TypeError('row must be type int')
 
    def get_column_values(self, column):
        """获取某一列的数据"""
 
        if isinstance(column, int):
            values = self.sheet.col_values(column-1)
            return values
        else:
            raise TypeError('column must be type int')
 
    def get_table_title(self):
        """获取表头"""
        table_title = self.get_row_values(1)
        return table_title
 
    def get_all_values_dict(self):
        """获取所有的数据,不包括表头,返回一个嵌套字典的列表"""
        max_row = self.get_max_row()
        table_title = self.get_table_title()
        value_list = []
        for row in range(2, max_row):
            values = self.get_row_values(row)
            value_list.append(dict(zip(table_title, values)))
        return value_list
 
    def get_all_values_nametuple(self):
        """获取所有的数据,不包括表头,返回一个嵌套命名元组的列表"""
        table_title = self.get_table_title()
        max_row = self.get_max_row()
        excel = namedtuple('excel', table_title)
        value_list = []
        for row in range(2, max_row):
            values = self.get_row_values(row)
            e = excel(*values)
            value_list.append(e)
        return value_list
 
    def write_value(self, sheet_index, row, column, value):
        """写入某个单元格数据"""
        if isinstance(row, int) and isinstance(column, int):
            if isinstance(sheet_index, int):
                wb = copy.copy(self.wb)
                worksheet = wb.get_sheet(sheet_index)
                worksheet.write(row-1, column-1, value)
                wb.save(self.filename)
            else:
                raise TypeError('{} must be int'.format(sheet_index))
        else:
            raise TypeError('{} and {} must be int'.format(row, column))
 
if __name__ == '__main__':
    pe = ParseExcel('testdata.xls', 'testcase')
    print('最大行号:', pe.get_max_row())
    print('最大列号:', pe.get_max_column())
    print('第2行第3列数据:', pe.get_cell_value(2, 3))
    print('第2行数据', pe.get_row_values(2))
    print('第3列数据', pe.get_column_values(3))
    print('表头:', pe.get_table_title())
    print('所有的数据返回嵌套字典的列表:', pe.get_all_values_dict())
    print('所有的数据返回嵌套命名元组的列表:', pe.get_all_values_nametuple())
   pe.write_value(0, 1, 3, 'test')

三、pandas

pandas是一个做数据分析的库, 总是感觉在自动化测试中使用pandas解析excel文件读取数据有点大材小用,不论怎样吧,还是把pandas解析excel文件写一下把

我这里只封装了读,写的话我这有点小问题,后面改好再追加代码吧。

请先pip install pandas安装pandas

封装代码

"""
import pandas as pd
class ParseExcel(object):
    def __init__(self, filename, sheet_name=None):
        try:
            self.filename = filename
            self.sheet_name = sheet_name
            self.df = pd.read_excel(self.filename, self.sheet_name)
        except Exception as e:
            raise e
    def get_row_num(self):
        """获取行号组成的列表, 从0开始的"""
        row_num_list = self.df.index.values
        return row_num_list
    def get_cell_value(self, row, column):
        """获取某一个单元格的数据"""
        try:
            if isinstance(row, int) and isinstance(column, int):
                cell_value = self.df.ix[row-2, column-1] # ix的行参数是按照有效数据行,且从0开始
                return cell_value
            else:
                raise TypeError('row and column must be type int')
        except Exception as e:
            raise e
    def get_table_title(self):
        """获取表头, 返回列表"""
        table_title = self.df.columns.values
        return table_title
    def get_row_value(self, row):
        """获取某一行的数据, 行号从1开始"""
        try:
            if isinstance(row, int):
                row_data = self.df.ix[row-2].values
                return row_data
            else:
                raise TypeError('row must be type int')
        except Exception as e:
            raise e
    def get_column_value(self, col_name):
        """获取某一列数据"""
        try:
            if isinstance(col_name, str):
                col_data = self.df[col_name].values
                return col_data
            else:
                raise TypeError('col_name must be type str')
        except Exception as e:
            raise e
        
    def get_all_value(self):
        """获取所有的数据,不包括表头, 返回嵌套字典的列表"""
        rows_num = self.get_row_num()
        table_title = self.get_table_title()
        values_list = []
        for i in rows_num:
            row_data = self.df.ix[i, table_title].to_dict()
            values_list.append(row_data)
        return values_list
if __name__ == '__main__':
    pe = ParseExcel('testdata.xlsx', 'testcase')
    print(pe.get_row_num())
    print(pe.get_table_title())
    print(pe.get_all_value())
    print(pe.get_row_value(2))
    print(pe.get_cell_value(2, 3))
    print(pe.get_column_value('Tc_title'))

总结

使用了3种方法,4个库 xlrd,openpyxl,xlwt,pandas 操作excel文件,个人感觉还是使用openpyxl比较适合在自动化中使用,当然不同人有不同选择,用哪个区别也不是很大。

以上3种方法,都可以拿来直接使用,不需要再做封装了 !

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

在这里插入图片描述

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/85043.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程间通信之信号机制2

文章目录 信号阻塞代码验证验证信号的阻塞验证信号的阻塞不影响信号注册验证可靠信号不会丢信号,不可靠信号会丢信号验证9号和19号信号不能被阻塞 用信号解决僵尸进程volatile关键字 信号阻塞代码验证 在上篇详解信号机制的博文中,我们提到了设置阻塞位…

Vue-9.集成(.editorconfig、.eslintrc.js、.prettierrc)

介绍 同时使用 .editorconfig、.prettierrc 和 .eslintrc.js 是很常见的做法,因为它们可以在不同层面上帮助确保代码的格式一致性和质量。这种组合可以在开发过程中提供全面的代码维护和质量保证。然而,这也可能增加一些复杂性,需要谨慎配置…

一文详解4种聚类算法及可视化(Python)

在这篇文章中,基于20家公司的股票价格时间序列数据。根据股票价格之间的相关性,看一下对这些公司进行聚类的四种不同方式。 苹果(AAPL),亚马逊(AMZN),Facebook(META&…

【Java】Java如何生成随机数?

文章目录 前言一、Random类介绍二、Random类生成随机数1.生成随机数2.nextInt()方法 三、使用场景四、官方提示总结 前言 我们在学习 Java 基础时就知道可以生成随机数,可以为我们枯燥的学习增加那么一丢丢的乐趣。本文就来介绍 Java 随机数。 一、Random类介绍 …

docker的资源控制及docker数据管理

文章目录 docker的资源控制及docker数据管理一.docker的资源控制1.CPU 资源控制1.1 资源控制工具1.2 cgroups有四大功能1.3 设置CPU使用率上限1.4 进行CPU压力测试1.5 设置50%的比例分配CPU使用时间上限1.6 设置CPU资源占用比(设置多个容器时才有效)1.6.…

合宙Air724UG LuatOS-Air LVGL API--简介

为何是 LVGL LVGL 是一个开源的图形库,它提供了创建嵌入式 GUI 所需的一切,具有易于使用的图形元素、漂亮的视觉效果和低内存占用的特点。 LVGL特点: 强大的 控件 :按钮、图表、列表、滑动条、图像等 高级图形引擎:动…

【Visual Studio】生成.i文件

环境 VS版本:VS2013 问题 如何生成.i预编译文件? 步骤 1、打开VS项目属性,打开C/C\预处理器页面,【预处理到文件】选择是,开启。 2、生成文件如下。 3、正常编译需要关闭此选项。

ORB-SLAM2学习笔记9之图像帧Frame

文章目录 0 引言1 Frame类1.1 构造和重载函数1.1.1 双目相机1.1.2 RGBD相机1.1.3 单目相机 1.2 成员函数1.2.1 特征点去畸变1.2.2 特征点网格分配1.2.3 双目匹配1.2.4 RGBD相机深度计算 1.3 成员变量 2 Frame类的用途 0 引言 ORB-SLAM2学习笔记7详细了解了System主类和多线程和…

安卓图形显示系统

Android图形显示系统 Android图形显示系统是Android比较重要的一个子系统,和很多其他子系统的关联紧密。 Android图形系统比较复杂,这里我们从整体上理一遍,细节留待后期再去深入。Android图形系统主要包括以下几个方面: - 渲染…

Shell编程及自动化运维实现

Linux Shell编程及自动化运维实现 变量 Linux Shell编程及自动化运维实现 判断 Linux Shell编程及自动化运维实现 循环 Linux Shell编程及自动化运维实现 数组和函数 Linux Shell编程及自动化运维实现 三剑客 Linux Shell编程及自动化运维实现 综合实战 什么是…

API 接口选择那个?RESTful、GraphQL、gRPC、WebSocket、Webhook

大家好,我是比特桃。目前我们的生活紧紧地被大量互联网服务所包围,互联网上每天都有数百亿次API调用。API 是两个设备相互通讯的一种方式,人们在手机上每次指尖的悦动,背后都是 API 接口的调用。 本文将列举常见的一些 API 接口&…

code论坛系统测试

目录 一 项目介绍**项目名称****项目介绍****项目功能****项目展示** 二 测试用例设计和功能测试1.测试用例设计**①登录页面****②注册页面****③首页****④发布帖子页面****⑤修改个人信息页面** 2.功能测试环境3.实际执行功能测试的部分操作**①登录页面****②注册页面****③…

ps怎么布尔运算多个图层合并?

我们经常使用Photoshop制作大型海报类,也可以用ps进行一些简单icon小图标的制作,这些icon图标多数应用在工具按钮上,比较小巧美观。但是对于ps对图形的操作经常会用到布尔运算的使用,今天小编就给大家详细讲解下ps布尔运算多个图层…

C语言和JavaScript中的默认排序行为对比

前言 今天在js里使用sort时遇见了一个不理解的现象 即使用sort默认排序后 9 从排序前的第一位被排到了最后一位.一开始我对js sort的理解和c一样,然后通过查阅后发现并不是这样. 正文 排序是一项常见而重要的操作。不同的编程语言提供了不同的排序函数&#xf…

常见的网络设备有哪些?分别有什么作用?

个人主页:insist--个人主页​​​​​​ 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、网络设备的概述 二、常见的网络设备 1、…

华星时空展锐芯片5g随身WiFi改串教程

前段时间入手了一个华正易尚,发现插手机卡可以用,插微闯移植卡直接没网,于是研究出展锐改串的教程分享给大家 ⭐注意:理论上所有的展锐芯片棒子都可以用,至于电池机请自行测试 话不多说,教程开始: 1.下载展锐AT改串驱…

Lnton羚通算法算力云平台如何在OpenCV-Python中使用cvui库创建复选框

CVUI 之 复选框 Python import numpy as np import cv2 import cvuidef checkbox_test():WINDOW_NAME Checkbox-Testchecked [False]# 创建画布frame np.zeros((300, 400, 3), np.uint8)# 初始化窗口cvui.init(WINDOW_NAME)while True:# 画布填色frame[:] (100, 200, 100…

Python学习日志(二)

数据类型转换 num_strstr(11)# 整数转换为字符串 print(type(num_str), num_str) 输出结果为&#xff1a; <class str> 11 类型转换成功&#xff0c;并且原本内容没有发生变化。 float_strstr(13.14)#小数转字符串 print(type(float_str),float_str) 同理&#xff0c;…

变动的Python爬虫实现

在电商时代&#xff0c;了解商品价格的变动对于购物者和卖家来说都非常重要。本文将分享一种基于Python的实时监控电商平台商品价格变动的爬虫实现方法。通过本文的解决方案和代码示例&#xff0c;您将能够轻松监控商品价格&#xff0c;并及时做出决策。 一、了解需求和目标 在…

Python将网络文件下载到本地

Python将网络文件下载到本地 前言相关介绍Python将网络文件下载到本地 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看基于DETR的人脸伪…