武汉13期龚婉莹 发表于 2022-4-26 09:33:22

python xlrd模块类和对象



xlrd模块
可用于读取excel表格数据(不支持写的操作,写操作需要xlwt模块来实现)
支持xlsx和xls格式文件,不支持csv文件
csv文件可以python自带的csv模块

import xlrd #导入xlrd模块surl=r'D:\test\dcs1.xlsx' #文件存放地址data=xlrd.open_workbook(url) #打开表格# 获取所有sheet名称print(data.sheet_names()) #['didi1', 'didi2']# 获取所有sheet对象print(data.sheets()) #[<xlrd.sheet.Sheet object at 0x00000000015E1F48>, <xlrd.sheet.Sheet object at 0x00000000015B8EC8>]# 通过名称获取对应的对象print(data.sheet_by_name('didi1')) #<xlrd.sheet.Sheet object at 0x00000000015A8E48># 通过索引获取对应的对象print(data.sheet_by_index(0)) #<<xlrd.sheet.Sheet object at 0x00000000015A8E48>print(data.nsheets) #2获取sheet数量

单元格的操作
import xlrd #导入xlrd模块surl=r'D:\test\dcs1.xlsx' #文件存放地址data=xlrd.open_workbook(url) #打开表格sheet=data.sheets()#通过对象获取sheet名称print(sheet.name) #didi1# 获取行数和列数print(sheet.nrows) # 11有效行数print(sheet.ncols) # 5有效列数print(sheet.row_values(0)) # 获取第一行的所有数据print(sheet.row(0)) #获取单元格值的类和内容print(sheet.row_values(0,2,5))# 0表示行索引值从0开始,2表示是开始的列,列也是从0开始,5是结束列(不包含)# 第一个数表示行数,第二个数表示开始的列,第三个数表示结束列print(sheet.row_values(1,1,4))通过遍历获取表格中指定的列或行所有的数据import xlrd #导入xlrd模块surl=r'D:\test\dcs1.xlsx' #文件存放地址data=xlrd.open_workbook(url) #打开表格sheet=data.sheets()#获取行for i in range(sheet.ncols):    print(sheet.col_values(i),end=' ') #获取列for i in range(sheet.nrows):    print(sheet.row_values(i),end=' ')

深拷贝浅拷贝理解
深浅拷贝就是可变元素的拷贝
浅拷贝:拷贝出的新对象和原对象是不一样的,但是对象里面的可变元素的地址一样
深拷贝:就是完全和以前没有任何关系,原有对象怎么改变都不会影响当前对象

深拷贝
修改拷贝后的数据不影响原有内容
import copylist=[['北京','成都'],'上海','杭州']list1=copy.deepcopy(list) #进行深拷贝# print(list1)# 打印两个列表的内存地址--不一致print(id(list)) #18691656print(id(list1)) #18939400# 打印两个子列表的内存地址--不一致print(id(list)) #18693448print(id(list1)) #18998664# 修改拷贝后list1list1='深圳'print(list1)print(list)# 打印修改后的列表,结果:list1列表修改了,但不影响list列表数据
浅拷贝
可理解为藕断丝连。
修改拷贝后的内容,原对象的内容修改
import copylist=[['北京','成都'],'上海','杭州']list2=copy.copy(list) #进行浅拷贝# 打印两个列表的内存地址--不一致print(id(list)) #18605768print(id(list2))#18625608# 打印两个子列表的内存地址--结果一致print(id(list)) #18736968print(id(list2))#18736968# 修改list2列表数据list2='武汉'print(list2)print(list)# 打印修改后的列表,结果:list列表数据随之改变


类与对象
a=2print(id(a)) #140734009277536print(type(a)) #<class 'int'>b=3print(id(b)) #140734009277568print(type(b)) #<class 'int'>b=2print(id(b)) #140734009277536print(type(b)) #<class 'int'>
上述代码可简单理解为2、3是两个人,a和b分别是他们的名字,就算3这个人的名字给了2这个人,2这个人也是不会变,这里的变指的是它们的内存中的地址。

类:class   用来描述具有相同的属性和方法的对象的集合
可以理解是一个模板,通过它可以创建出无数个具体的实例

对象:类不能直接使用,通过类创建出实例(又称对象)
这个有点像汽车图纸和汽车的关系,图纸本身(类)不能被人直接使用,通过图纸创造出汽车(对象)才能使用

对象和类的关系:就像摸具和铸件的关系
类的实例化的结果就是对象,而对象的抽象体就是类

属性:类中的所有变量称为属性

在python中,定义类是通过class关键字
注:class后面紧接着是类名称,即dcs,类名称通常大写开头,后面是(object),表示改类从哪个类继承下来的,通常如果没有合适的类,就使用object类,这个是所有类最终都会继承的类
class dcs(object):
    pass

类名称定义

[*]不要以纯数字命名
[*]不要以python中保留字符命名
[*]不要以文件名命名
[*]要简单且见名知意

当类名称有多个单词,应采用驼峰式(单词首字母大写)——Dcs()

定义好dcs类,就可以根据dcs类创建出dcs的实例,创建实例通过类名称加()实现

class dcs1():    def __init__(self,a,b): #构造函数      self.a=int(a) #实例变量      self.b=int(b)    def add(self): #类方法(只能通过对象来调用)      return self.a+self.b    def reduce(self):      return self.a-self.b    def ride(self):      return self.a*self.b    def Excrpt(self):      return self.a/self.bp=dcs1('12','2') #实例化创建一个对象print(p.add()) #实例化对象调用类方法print(p.reduce())#实例化对象调用类方法print(p.ride())#实例化对象调用类方法print(p.Excrpt())#实例化对象调用类方法class dcs1():    def add(self,a,b): #类方法(只能通过对象来调用)      return a+b    def reduce(self,a,b):      return a-b    def ride(self,a,b):      return a*b    def Excrpt(self,a,b):      return a/bp=dcs1()print(p.add(2,3))print(p.reduce(5,2))print(p.ride(1,1))print(p.Excrpt(2,1))
当类中初始化方法或 __init__ 中存在参数时,则实例化,需要往实例化括号中传入参数
不存在参数时,则实例化时不需要往实例化括号中传入参数,而在调用方法时再进行传参

class A(object):#新式类
class c:   #经典类
python3当中默认继承object类,所有它不区分新式类和经典类,python2当中没有默认继承的,需要自己继承,所有它是区分新式类和经典类。

类变量
a=300 #普通全局变量class dcs(): #定义类    a1=200 #类变量(如果方法中要调用它需要加self)    def __init__(self,name): #构造函数      self.a2=name #把形参变为实际化变量(类的全局变量)      #实例变量在当前类中,只要是带有self的都可以使用    def A1(self):      print(self.a2) #调用实例化变量      print(self.a1) #调用类变量      print(a) #调用普通全局变量if __name__ == '__main__':    c=dcs(100) #创建对象    c.A1() #对象调用方法





页: [1]
查看完整版本: python xlrd模块类和对象