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]