版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章面向对象Python程序设计01面向对象简介02类与对象03类的继承与组合04本章回顾01面向对象面向对象(ObjectOriented)是一种编程思想,是基于面向过程的编程思想慢慢发展而来的。面向对象与面向过程面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候依次调用就可以了。而面向对象是把构成问题的事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为,面向对象是一种“自下而上”的设计语言,先设计组件,再完成拼装。面向对象相较于面向过程有更强的灵活性和扩展性。面向过程与面向对象举例以剪刀石头布游戏为例来理解面向过程和面向对象思想的区别,面向过程的设计思路就是按照步骤来实现:①开始游戏。②玩家1出剪刀或石头或布。③玩家2出剪刀或石头或布。④根据玩家出的结果判断输赢。⑤重复步骤2、3、4,直到退出游戏。面向对象的设计则是从另外的思路来解决问题,整个游戏中玩家1和玩家2属性和行为一致,可以用玩家类表示,判断输赢可以用游戏规则类表示,程序的实现步骤如下:①使用玩家类接收用户输入并将输入结果传递给游戏规则类。②利用游戏规则类中的方法对输赢进行判定。从上面的案例可以看出,针对同一个问题,面向过程和面向对象解决问题的思路有很大差异,从面向过程到面向对象,不仅仅是编程方式的改变,更重要的是思考方式的改变。面向过程与面向对象区别面向过程更注重步骤与过程,不注重职责与分工,在开发简单系统可行,但面对复杂大型系统时代码会冗杂。面向对象注重职责与分工,完成需求前先确定职责,再根据职责确定对象并封装方法,最后根据业务需求让不同对象调用不同方法。同时提到有面向过程和面向对象区别的总结表(下表)。面向对象基本概念学习面向对象编程需先了解相关概念。1.对象:在Python中一切皆为对象,如人、鸡、花等都可表示为对象,具有唯一性,有属性和行为,属性是静态部分如人的名字、性别等,行为是动态部分如吃饭、睡觉、工作等。2.类:是具有相同属性和方法的对象的集合,是对象的模板,可对共有的属性和方法进行定义,如狗的类有嘴、眼睛、腿等属性和睡觉、吃东西、摇尾巴等行为,邻居家小狗是该类的一个对象。3.实例化:创建类的实例即生成具体对象,如“狗”是类,自己养的宠物狗XX是实例化后的实例对象。类和对象的关系类和对象的关系可总结为以下几点:①类是对象的模板,对象是类的具体实例。②类是抽象的,对象是具体的。③每一个对象都是某个类的实例。面向对象程序设计的特点面向对象程序设计有封装、继承、多态三大特点。
封装:是面向对象编程核心思想,把客观事物封装成类,可将相同属性和行为的对象封装成类并隐藏不必要信息,确保类内部数据完整。优点包括减少耦合、可自由修改类内部结构、保护成员属性、隐藏信息实现细节。
继承:是面向对象程序设计基石,实现代码复用。子类继承父类特征和行为,可定义自己的属性和方法。优点有提高类代码复用性、可维护性,使类之间产生关系且是多态前提。
多态:允许不同类对象对同一消息有不同响应,通过动态绑定实现,同一操作作用不同对象有不同结果。存在条件为继承、子类重写父类方法、父类引用变量指向子类对象。02类与对象在生活中先有对象再有类,而在程序中是先有类才能有对象。在Python中,类的定义使用class关键字实现,其语法格式如下:参数说明如下表所示。类的定义类的定义举例如下图所示。类的定义类在定义时可以为其添加说明文档,说明文档放在字符串中,通常位于类内部、所有代码的最前面,可以通过内置的help()函数或__doc__属性获取说明文档的内容(和函数的说明文档类似),如右图所示。类的实例化类定义好之后,相当于有了一个模板,但没有对象。对象的生成是通过类的实例化实现的,类的实例化语法如下:其中ClassName为类名,parameterlist为参数列表,类实例化时ClassName是必须指定的,是否有parameterlist要结合__init__()方法中的参数情况。创建__init__()方法__init__()方法类似于Java语言中的构造方法,在类实例化时会自动调用。__init__()方法必须包含一个self参数,且必须是第一个参数,如果没有指定self参数的话,实例化时会报错,如图5-2所示。创建__init__()方法self参数是一个指向实例本身的引用,用于访问类中的属性和方法。当__init__()方法中只有一个self参数时,实例化时不需要指定参数,因为调用__init__()方法时会自动传递self参数,如图5-3所示。创建__init__()方法在__init__()方法中,除了可以指定self参数,还可以自定义一些其它参数,举例如【代码5-2】所示。创建__init__()方法【代码5-2】的运行结果如图5-4所示。类的属性属性是在类中定义的变量,有时也称为特征,即类中客观存在的静态部分。根据属性定义的位置不同,可分为类属性和实例属性。类属性与实例属性类属性是在类中方法之外定义的属性,实例属性是定义在类的方法中的属性,类属性可以在类的所有实例之间共享值,实例属性只作用于当前实例中。在右图中,类中方法外定义的属性grade为类属性,__init__()方法中定义的属性name、sex和age为实例属性。类属性与实例属性类属性可以通过类名或对象(实例)名访问,类属性需通过类名来修改,类属性修改后会作用于该类的所有实例中,如右图所示。类属性与实例属性实例属性只能通过对象名访问,使用类名访问会报错,如下图所示。类属性与实例属性·实例属性可以通过对象名修改,修改一个对象的实例属性并不影响其它对象中的实例属性,如下图所示。属性的访问权限类的属性根据外部对其访问的权限,分为共有属性、保护属性和私有属性,总结如下表所示。属性的访问权限接下来我们定义一个Person类来举例说明,如右图所示。属性的访问权限在上页代码中,name是公有属性,age是保护属性,可以直接通过对象名访问,如右图所示。属性的访问权限height和weight是私有属性,需通过“实例名._类名__XX”方式访问,直接通过对象名访问会报错,如下图所示。属性的访问权限在实际开发过程中,为了避免客户端直接对属性进行修改,我们一般将属性设置为私有,然后通过set方法设置值,通过get方法获取值,如右图所示。类的方法在5.2.1中,我们接触过类的方法,即__init__()方法。这个方法用来初始化一个对象,在实例化时自动执行,如果一个类中没有提供__init__()方法,Python将提供一个默认的__init__()方法。实例方法init__()方法在类内部有特殊的功能,属于特殊方法,除此之外,我们也可以在类中自定义其它的方法,该方法是一种在类的实例上操作的函数,所以叫做实例方法。实例方法的第一个参数必须是self,其语法格式如下:实例方法其中functionName为方法名,一般使用小驼峰法命名,self用来表示类的实例,parameterlist用于指定self以外的其它参数,block是用于实现具体功能的方法体。关于实例方法的使用举例如右图所示。实例方法实例方法的访问权限实例方法的访问权限与类属性的访问权限类似,可分为公有方法、保护方法和私有方法。实例方法的访问权限总结如下图所示。实例方法的访问权限接下来我们改造之前的Person类,分别定义公有方法、保护方法和私有方法,如右图所示。实例方法的访问权限类的实例化之后,公有方法可以直接访问,如下图所示。实例方法的访问权限保护方法通过单下划线访问,如右图所示。私有方法不能在类外部访问,不然会报错,如右图所示。实例方法的访问权限在公有方法judge_BMI()中使用代码“BMI=self.__get_BMI2()”访问了私有方法,调用judge_BMI()方法的运行结果如下图所示。类方法类方法使用装饰器“@classmethod”修饰,类方法的第一个参数必须是当前类对象(一般约定为“cls”),通过这个参数来传递类的属性和方法,类和实例对象都可以调用类方法。类方法的使用举例如右图所示。类方法运行结果如下图所示。类方法需要注意的是类方法中一定要有cls参数,如果不提供参数的话会报错,如右图所示。静态方法(2)静态方法静态方法使用装饰器“@staticmethod”修饰,静态方法与普通方法类似,不需要有self参数和cls参数,一个类中的所有实例共享静态方法,类和实例对象都可以调用静态方法。我们将上页代码中的类方法修改成静态方法,如右图所示。静态方法运行结果如下图所示。03类的继承与组合继承是实现代码重用的重要手段,当要编写的类和之前已经使用过的类有很多属性和方法是相同的,且存在一定的继承关系时,即可使用继承这种方式来达到代码重用的目的。如之前使用过的Person类和Student类,Student类就可以继承自Person类。父类与子类学习继承需先了解父类和子类概念。在Python中,Object类是所有类的父类。继承特性源于生活,如每个人从人类祖先继承说话、走路等行为,从父辈继承相貌、身高等特征,同时每个人也有独特的特征和行为。在Python中,父类和子类的关系可总结如下:子类继承父类的属性和方法。子类可以在父类的基础上额外添加属性和方法。子类可以重写父类的方法。一个子类可以有多个父类,即多重继承。继承的语法Python中继承的语法格式如下:参数说明如下图所示。继承的语法接下来我们定义一个Animal类做为父类,Dog类和Cat类分别继承Animal类,如右图所示。继承的语法运行结果如下图所示。方法重写子类会继承父类的方法,当父类中的某个方法不适用于子类时,子类可以对其进行重写。需要注意的是当子类重写父类的__init__方法时,如果需要父类的构造方法时需使用super关键字显式地调用,如果子类不重写__init__方法,实例化子类时,会自动调用父类定义的__init__方法。方法重写右图中,子类Dog没有重写父类的__init__方法,实例化时自动调用了父类的__init__方法。当子类重写了__init__方法,但是不需要父类的构造方法时,子类被实例化时直接调用子类重写后的__init__方法,如右图所示。方法重写方法重写的使用举例如右图所示。方法重写方法重写运行结果如下图所示。方法重写从上页及其运行结果可总结出:
1.子类Dog重写了__init__()方法和personality()方法,重写__init__()时通过“super().init(name,shout)”显式调用父类的__init__()方法。
2.子类Cat重写了personality()方法,未重写__init__()方法,实例化时自动调用父类__init__()方法。
3.实例化对象dog和cat都调用了父类定义的info()方法和各自重写后的personality()方法,返回结果不同。类的组合代码重用除继承方式外还有类的组合,即在一个类中以另一个类的对象作为数据属性。当类之间差异显著且一个大类由多个小类组成时可使用组合。例如电脑有品牌、颜色、内存等信息,可分为基本信息、硬件、操作系统三类,计算机这个大类可看成由这些小类的对象组成,如右图所示。类的组合类的组合运行结果如右图所示。在实际开发过程中,我们可以结合业务需求,将继承、组合两种方式结合使用。案例【案例描述】马戏团,是进行马戏表演的团体组织。它起源于非常血腥残酷的古罗马角斗士斗兽场。当时有“只有面包和马戏”才能使罗马人快乐的说法。在英文里,马戏团叫做“Circus”,源自拉丁文“圆圈”的意思,指圆形露天竞技场。现代的马戏团也在圆形场地中演出,因此演变成“马戏团”的意思。马戏的主要内容是动物表演,之所以被称为“马戏”,是因为最早的表演的主角是马,以后才陆续出现其它的动物演员。【案例要求】本案例模拟马戏团运行流程,按照菜单选择查看动物基本信息(本马戏团中动物演员包括但不限于海豚、猴子、狮子等)、随机观看表演、顺序观看表演等。案例本章回顾1.【多选】关于面向对象描述正确的有()。A.面向对象(ObjectOriented)是一种编程思想,是基于面向过程的编程思想慢慢发展而来的B.面向对象是把构成问题的事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为C.面向对象是一种“自下而上”的设计语言,先设计组件,再完成拼装D.面向对象适用于简单系统,容易理解2.【多选】关于面向过程描述正确的有()。A.面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候依次调用就可以了B.面向过程是以过程/方法为中心来组织编程方式C.面向过程难以应对复杂系统,难以复用,不易维护、不易扩展D.面向过程更注重的是步骤与过程,不注重职责与分工综合练习3.【多选】关于类和对象的关系描述正确的有()。A.类是用来描述具有相同的属性和方法的对象的集合B.类是对象的模板,对象是类的具体实例C.实例化就是创建一个类的实例,也就是生成类的具体对象D.类是抽象的,对象是具体的4.【多选】关于面向对象程序设计的特点,描述正确的有()。A.封装是面向对象编程的核心思想B.继承是实现代码复用的重要手段C.多态指允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式D.继承可以提高代码的复用性和可维护性综合练习5.【多选】关于类属性与实例属性描述正确的有()。A.类属性是在类中方法之外定义的属性,实例属性是定义在类的方法中的属性B.类的所有实例之间不可以共享类属性的值C.类属性可以通过类名或对象(实例)名访问D.实例属性只能通过对象名访问6.【多选】关于类属性的访问权限描述正确的有()。A.没有以任何下划线开头的属性是公有属性,可在类的外部直接访问B.以单下划线“_”开头的属性是保护属性,只有其本身和子类能访问C.以双下划线“__”开头的属性是私有属性,只有该类本身可以访问,子类不能访问D.私有属性不能通过类的实例直接访问,需通过“实例名._XX”来访问综合练习7.定义类的关键字是()。A.function B.def
C.classD.define8.关于__init__()方法描述错误的是()。A.__init__()方法类似于Java语言中的构造方法,在类实例化时会自动调用B.__init__()方法必须包含一个self参数,且必须是第一个参数C.当__init__()方法中只有一个self参数时,实例化时也需要指定该参数D.self参数是一个指向实例本身的引用,用于访问类中的属性和方法9.关于类的方法,描述错误的是()A.类方法使用装饰器“@classmethod”修饰B.静态方法使用装饰器“@staticmethod”修饰C.类方法不需要有self参数和cls参数D.一个类中的所有实例共享静态方法,类和实例对象都可以调用静态方法综合练习10.以下关于继承的描述,错误的是()。A.父类是指直接或间接被继承的类,子类是指通过继承派生出来的新类B.子类可以在父类的基础上额外添加属性和方法C.子类可以重写父类的方法D.在Python中,一个子类只能有一个父类11.关于方法重写,描述错误的是()。A.子类会继承父类的方法,当父类中的某个方法不适用于子类时,子类可以对其进行重写B.当子类重写父类的__init__方法时,如果需要父类的构造方法时需使用super关键字显式地调用C.如果子类不重写__init__方法,实例化子类时,会自动调用父类定义的__init__方法D.子类一定要重写父类的__init__方法综合练习12.关于类的组合,描述错误的是()。A.继承和组合不能一起使用B.继承和组合都是实现代码重用的重要手段C.类的组合,就是在一个类中以另外一个类的对象作为数据属性D.当一个大类是由多个小类组成时,可以使用组合13.简述面向对象与面向过程的区别。期待您的宝贵意见Python程序设计教学团队第六章
模块Python程序设计01模块、包和库02常用标准库模块的使用03基于第三方库的爬虫应用04本章回顾01模块、包和库模块是将功能封装起来,使用时直接导入,可提高代码开发效率、避免重复开发,类似函数和类有封装思想,但模块是更复杂功能的封装容器。以洗衣机为例,将洗衣机类比为模块,人们使用洗衣机无需关心其工作原理,如同使用模块无需了解其具体实现,只需使用其功能。
在开发过程中,总是会接触到模块、包、库等概念,这些概念简单理解就是函数、类、变量等可以封装在模块(module)中,多个模块可以封装到包(package)里面,多个包可以封装到库(library)里面。模块及其导入方式我们在第一章的时候,就接触过模块这个概念,那么到底什么是模块呢?简单理解,模块就是一个包含了许多功能/方法的文件,即每一个.py文件都可以被当成是一个模块,模块可以包含直接运行的代码块、类、函数或这几种的组合。导入模块的常用方式有三种,分别是import语句、from…import语句和from…import*语句。模块及其导入方式import语句import语句用于导入整个模块,支持导入多个模块,语法格式如下:
以我们之前使用过的随机生成整数的函数randint为例,由于需要使用randint函数,而randint函数位于random模块下,所以在使用randint函数之前需要使用语句“import
random”进行模块导入,如下图所示。模块及其导入方式如果在使用randint函数之前没有导入random模块,将会报NameError错误,提示“name'random'isnotdefined”,如下图所示。模块及其导入方式使用import语句的方式导入,因为是导入的整个模块,所以需要使用“模块名.函数名”的方式调用函数。除此之外,我们还可以使用as关键字对引入的模块重命名,如下图所示。模块及其导入方式from…import语句模块导入除了可以整个模块都导入之外,也可以使用“from…import语句”只导入某个或某几个函数,语法格式如下:
使用此种方式导入,可以直接使用函数名进行调用,还是以random模块为例,如下图所示。模块及其导入方式from…import*语句使用“from…import*语句”可以导入一个模块的所有内容,举例如下图所示。自定义模块自定义模块就是根据业务需求自行定义的模块,JupyterNotebook对自定义模块的支持不是很友好,所以为了演示自定义模块的使用,我们使用安装Anaconda时自带的另一个工具Spyder,如下图所示。自定义模块打开Spyder,在本地电脑上找一个合适的位置新建一个文件夹“test_module”,然后在此文件夹下新建一个“animal_act.py”文件(File->NewFile),然后将“案例7:马戏团动物表演”中的【代码5-12】粘贴进去,单击“运行按钮”,看控制台是否输出正常,如下图所示。此时“animal_act.py”文件就是一个自定义的模块,想要引用这个模块,分为同级目录下引用和非同级目录下引用两种情况。自定义模块同级目录下引用我们在和它同一个文件夹“test_module”中新建一个“test.py”文件,此时如果想在“test.py”文件中引入自定义模块“animal_act.py”,可以使用“import语句”直接导入,如下图所示。自定义模块非同级目录下引用自定义模块,直接用import无法找到,要借助sys模块导入自定义模块的path。以新建文件夹“test_module2”及其下的文件“test2.py”为例,若要在“test2.py”中引入非同级目录下的自定义模块“animal_act.py”,直接引入会报错。如下图所示自定义模块正确的引用方式如下所示。此时单击“运行按钮”,可以正常运行“animal_act.py”文件下的start()方法了,运行结果如下图所示。什么是包在Python中,包是一个分层次的文件目录结构,是由模块及子包、子包下的子包等组成的Python应用环境。简单理解包就是文件夹,但是该文件夹下必须包含“__init__.py”文件(__init__.py文件内容可以为空),也就是“__init__.py”文件用于标识当前文件夹是否为一个包。“__init__.py”文件的作用可总结为:
与普通目录的区别标识,即用于标识当前文件夹是否为一个包。
编写代码,定义类、函数、变量等。包的使用为了更好地演示包的使用,我们还是使用Spyder工具。打开Spyder,在本地电脑上找一个合适的位置新建一个文件夹“testpackage”,在此文件夹下新建一个空的“__init__.py”文件(Spyder中新建文件:File->NewFile),然后再分别建文件“testpackage1.py”和“testpackage2.py”,此时目录结构如下图所示。包的使用文件“testpackage1.py”和“testpackage2.py”中的代码分别如下所示。包的使用然后我们在包外面新建一个文件“usepackage.py”,在文件中引入包并使用其中的模块,如下所示运行“usepackage.py”文件,结果如下图所示。标准库与常用标准库模块库是为了方便管理与安装,将能够实现某一功能的模块和包封装而成的集合。根据库是否已经包含在Python官方安装包中,可以将其分为标准库和第三方库。标准库就是在Python官方安装包中包含的库,即安装好Python后就具有的库。标准库中的模块就是标准库模块,常用的标准库模块总结如表所示。第三方库第三方库就是在Python官方安装包中不包含的库,第三方库中的模块即第三方模块。想要使用第三方库中的模块,需要先安装第三方库。第三方库可以在命令行窗口使用pip命令在线安装,也可以先下载相应的第三方库安装程序,然后再进行安装。Python的一大优势就是有丰富且易用的第三方库及模块,省去了大量重复造轮子的时间,常用的第三方模块有用于图像处理的pillow,用于处理URL资源的requests,用于数据可视化的matplotlib等。02常用标准库模块的使用在实际开发中我们要经常使用系统的标准库模块,比如我们想实现字符串匹配功能,可以使用正则表达式re模块;想要实现时间相关功能,可以使用time模块、datetime模块;想要实现数学运算,可以使用math模块;想要实现加密功能,可以使用hashlib模块;本节我们将对上述模块的基本使用进行介绍。正则表达式是用于匹配字符串中字符组合的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。正则表达式是用来匹配字符串的非常强大的工具,正则表达式主要由普通字符、元字符、重复限定符等组成。普通字符就是大小写字母、数字等,用于匹配自身。正则表达式可以是单个字符、也可以是由上诉字符任意组合形成的字符集合。正则表达式介绍元字符元字符是构造正则表达式的一种基本元素,常用的元字符总结如右表所示。了解了元字符之后,我们就可以开始写一些简单的正则表达式了,如11位手机号码的正则表达式可表示如下:正则表达式介绍重复限定符上述举例的表示手机号的正则表达式有很多重复的元字符“\d”,为了解决这一问题,正则表达式中提供了重复限定符。常用的重复限定符总结如表所示。正则表达式介绍有了上一个表中的重复限定符后,我们之前举例的11位手机号码的正则表达式就可以写成如下的形式:分组
正则表达式中用小括号“()”来做分组,也就是小括号中的内容作为一个整体。因此181号段电话号码的正则表达式可表示如下:正则表达式介绍选择字符还是以手机号码为例,大家都知道,国内的手机号都来自电信、联通、移动三大运营商,而每个运营商提供的号段是不一样的,以电信手机号为例,其号段有199、191、189、181、180、177、173、153和133。此时我们想写电信手机号的正则表达式,就需要用到选择字符或“|”来实现,其正则表达式如下:区间正则表达式中提供中括号“[]”来表示区间条件,如数字0~9可以写成[0-9],字母a~z可以写成[a-z]。需要注意的是字符“^”在区间中不再表示字符串的开始,而是代表排除的意思,即匹配不在区间范围内的字符,如[^6]代表除6以外的字符。正则表达式介绍转义字符在正则表达式中点“.”代表任意字符,而我们需要单纯的使用点“.”这个字符的时候,就需要用到转义字符了。正则表达式中的转义字符就是在特殊字符之前加上反斜杠“\”,将其变为普通字符。比如IP地址(,等)的正则表达式可表示如下:使用re模块实现正则表达式Python中的re模块用于实现正则表达式相关操作,本节主要介绍一些常用属性和方法的使用。re模块常用标志位修饰符re模块具有一些属性用于做为标志位的修饰符,用来控制正则表达式的匹配方式,如不区分大小写、多行匹配等,总结如表所示。使用re模块实现正则表达式re模块常用方法compile()方法:pile()方法是用于优化正则表达式的,可以将正则表达式转化为对象,然后多次调用正则表达式就重复利用这个正则对象,可以实现更有效率的匹配。compile()方法生成的对象需要和match()、search()和findall()等方法搭配使用,单独使用没有意义。compile()方法的使用举例如下:使用re模块实现正则表达式match()方法。match()方法用于从字符串开始位置进行匹配,即匹配以XXX开头的字符串,其基本语法如下:参数说明如表6-5所示。使用re模块实现正则表达式使用match()方法匹配成功会返回一个Match对象,匹配失败返回None,如图所示。上图中的例子,我们使用了标志位修饰符re.I忽略大小写,如将re.I删除,运行结果将返回2个None,如下图所示。使用re模块实现正则表达式search()方法。search()方法用于扫描整个字符串并返回第一个成功的匹配,即匹配第一次出现的XXX,语法格式与match()方法类似。search()方法匹配成功也是返回一个Match对象,匹配失败返回None,如下图所示。使用re模块实现正则表达式从上两图的运行结果可看出match()方法和search()方法的区别,match()方法只匹配以给定正则开始的字符串,而search()方法搜索整个字符串,直到找到一个匹配。match()方法相当于在search()方法的正则表达式最前面加了一个符号“^”。使用match()方法和search()方法匹配成功后返回的Match对象也具有其属性和方法,常用的总结如右表所示。使用re模块实现正则表达式关于Match对象的使用举例如左图所示。使用re模块实现正则表达式
findall()方法。
findall()方法用于在字符串中搜索与给定正则匹配的所有子串,并以列表形式返回,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。findall()方法的语法格式与match()、search()方法类似,不同的是match()、search()方法只匹配一次,findall()方法匹配所有符合条件的子串。
接下来使用一个输入QQ邮箱获取QQ号码的案例来说明findall()方法的使用,如下所示。使用re模块实现正则表达式上诉代码的运行结果如下图所示。使用re模块实现正则表达式sub()方法。sub()方法用于实现字符串的替换,即按照正则规则去寻找被替换的内容,其语法格式如下:参数说明如表所示。使用re模块实现正则表达式sub()方法的使用举例如下所示。上诉代码的运行结果如下图所示。
split()方法。
split()方法用于实现字符串的分割,即将字符串按照正则分割成子串,并以列表的形式返回,其语法格式如下:使用re模块实现正则表达式参数说明如表所示。使用re模块实现正则表达式split()方法的使用举例如下所示。上诉代码的运行结果如下图所示。使用re模块实现正则表达式以上介绍了6个re模块中的常用方法,现将其总结如表所示。日期和时间模块(1)time模块中的时间格式在time模块中时间表现的格式主要有时间戳、时间元组、格式化时间三种。时间戳,即timestamp,表示的是从1970年1月1日00:00:00开始按秒计算的偏移量,适用于做日期运算。时间元组,即struct_time,共有九个元素组,如表所示。time模块格式化时间,即format_time,已格式化的结构使时间更具可读性,包括自定义格式和固定格式。关于格式化时间的相关符号总结如表所示。time模块(2)time模块常用方法time模块的常用方法包括time()、sleep()、localtime()等,现将其总结如表所示。time模块time模块的常用方法使用举例如右所示。datetime模块datatime模块在time模块基础上重新进行了封装,提供更多更多好用的类供我们使用,常用的包括date、time、datetime、timedelta等。datatime模块包含MAXYEAR和MINYEAR两个常量,分别是能表示的最大年份(9999)和最小年份(1)。(1)date类datatime模块中的date类用于表示日期,其主要由year(年)、month(月)及day(日)三部分构成,date对象的格式如下所示:datetime模块date类常用的属性和方法总结如表示。datetime模块date类的使用举例如下所示。datetime模块上诉代码的运行结果如下图所示。(2)time类datatime模块中的time类用于表示时间,其主要由hour(小时)、minute(分钟)、second(秒)、microsecond(毫秒)和tzinfo(时区信息)五部分组成,time对象的格式如下所示:datetime模块time类常用的属性和方法于date类相似,使用举例如右所示。代码的运行结果如下图所示。datetime模块(3)datetime类datatime模块中的datetime类用于表示日期和时间,可以看成是date类和time类的结合,datetime类大部分的方法和属性都继承于date类和time类。datetime对象的格式如下所示:datetime模块datetime类的使用举例如下所示。datetime类中除了继承date类和time类的方法,还有其特有的方法,总结如表所示。datetime模块上诉代码的运行结果如下图所示。datetime模块(4)timedelta类datatime模块中的timedelta类用于做时间运算,一般与date类、datetime类结合使用。timedelta对象的格式如下所示:
timedelta类的使用举例如代码所示。运行结果如下图所示。加密模块与其它常用模块Python中的hashlib模块提供加密的相关操作,包含MD5和SHA加密,支持md5,sha1,sha224,sha256,sha384,sha512等算法。·MD5与SHAMD5全称Message-DigestAlgorithm5,是广泛使用的密码散列函数,能产生128位(16字节)散列值,保障信息传输的完整性与一致性。SHA全称SecureHashAlgorithm,是基于MD5产生的算法家族,包括sha1、sha224、sha256等多种算法。MD5和SHA都是不可逆的摘要算法,原理是通过函数将任意长度数据转换为固定长度的数据串。hashlib模块的使用hashlib模块的使用可分为创建hash对象、更新hash对象和返回摘要三步,其常用属性和方法总结如表所示。hashlib模块的使用hashlib模块的使用举例如下图所示。上诉代码的运行结果如下图所示。其它常用模块总结除了上述介绍的常用标准库模块之外,sys模块、random模块、math模块也经常使用,现将其常用方法、属性总结如表所示。其它常用模块总结其它常用模块总结其中sys模块中的modules.keys()方法用于返回所有已经导入的模块列表,运行效果如下图所示。03基于第三方库的爬虫应用很多编程语言都可以编写爬虫程序,但是使用Python语言编写爬虫无疑是最简单、最合适的,也有很多同学是因为了解爬虫才知道了Python。这一切都要归功于Python的丰富类库,可以方便高效地下载网页和解析网页。·网络爬虫概述
网络爬虫,又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,已被广泛应用于互联网领域。网络爬虫是一种数据采集工具,如我们想对某网站进行分析,那么待分析的数据去哪里获取呢?此时就可以考虑使用网络爬虫进行爬取。网页基础由于网络爬虫主要是爬取网页的数据,那么在学习爬虫之前,首先我们需要先了解网页的基础知识。当我们打开浏览器,在地址栏中输入URL(UniformResourceLocator,统一资源定位器),如输入“”,即可出现百度的首页。我们可以单击键盘上的“F12”打开开发者工具查看,如下图所示。网页基础(1)访问网页的流程从图6-29中我们可看到Request和Response的一些信息,其实从输入URL到我们看到页面,其流程可总结如下:①输入URL。②浏览器给Web服务器发送一个Request。③Web服务器接到Request后进行处理,生成相应的Response,然后发送给浏览器。④浏览器解析Response中的HTML,这样我们就看到了网页。(2)HTTP协议上述提到的Request和Response是HTTP协议中的请求和响应。HTTP,即HyperTextTransferProtocol,超文本传输协议,是一种基于请求与响应模式的、无状态的应用层协议。HTTP是网页中数据通信的基础,当我们在浏览器键入任何一个URL时,都是在发送一次HTTP请求。网页基础HTTP请求由请求行、请求头和请求正文组成。其中请求正文就是一些发送的数据,请求头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息(如用户标识,主机名等),请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下所示:参数说明如表所示。网页基础HTTP响应与HTTP请求类似,也是由三部分组成,分别是状态行、响应头和响应正文。状态行的格式如下:参数说明如表6-18所示。网页基础通过网页开发者工具查看上述访问百度页面的请求头和响应头信息分别如下图所示。网络爬虫的一般流程熟悉了网页基础知识之后,接下来我们看一下网络爬虫的一般流程。①获取待爬取的URL/URL队列,发送Request。②通过Request获取Response内容(HTML、Json字符串、二进制数据等)。③将得到的Response内容进行解析(使用正则表达式、网页解析库等)。④将解析后的数据进行保存。上述流程简单理解就是第1步和第2步是网页下载,第3步是网页解析,第4步为数据存储。爬虫相关库介绍网络爬虫主要由网页下载、网页解析和数据存储三部分组成。网页下载:Python中可使用标准库的Urllib模块或第三方库Requests,Requests比Urllib更方便高效,本节重点介绍Requests。网页解析:可使用正则表达式或第三方库BeautifulSoup等,正则表达式已在6.2.1介绍,本节主要介绍BeautifulSoup库。数据存储:可使用纯文本、关系型数据库(如MySQL、Oracle、SQLServer等)、非关系型数据库(如MongoDB、Redis等),数据存储部分在7.2介绍。网页下载库Requests介绍
Requests是基于Urllib开发的,使用Apache2Licensed开源协议的HTTP库,Request是一个第三方库,需要使用pip命令进行安装(pipinstallrequests)
(1)Requests库的常用属性/方法Requests库的常用属性/方法总结如表所示。网页下载库Requests介绍(2)Requests库的基本使用Requests的使用很简单,还是以访问百度网页为例,如右图所示。网页下载库Requests介绍上诉代码的运行结果如图所示。网页下载库Requests介绍(3)携带头部信息发送请求在上诉代码中,我们访问的是百度首页,状态码是“200”,代表访问成功,而大多数时候,我们直接访问网页时,会出现403Forbidden,代表访问被拒绝,如右图所示。出现右图这种错误的原因是,该网页进行了反爬虫设置,此时如果想要成功访问此网页,可以通过模拟浏览器的头部信息“User-Agent”来实现。“User-Agent”信息可以在开发者工具中查看,如下图所示。网页下载库Requests介绍网页下载库Requests介绍接下来我们携带头部信息,再一次访问知乎首页,如下图所示。网页下载库Requests介绍上诉代码的运行结果如下图所示。BeautifulSoup介绍网页解析库BeautifulSoup介绍BeautifulSoup是一个解析HTML/XML文件的第三方库,主要用于从HTML/XML文件中提取数据,其提供一些简单的函数来处理导航、搜索、修改分析树等功能。使用BeautifulSoup时不需要考虑编码方式,它会自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。BeautifulSoup介绍(1)BeautifulSoup库的导入BeautifulSoup3目前已经停止开发,现在项目中使用的是BeautifulSoup4(可以使用命令“pipinstallbeautifulsoup4”进行安装),不过它已经被移植到bs4中,也就是说导入时直接使用“importBeautifulSoup”会报错,需要使用语句“frombs4importBeautifulSoup”进行导入,如下图所示。BeautifulSoup介绍(2)BeautifulSoup解析器BeautifulSoup在解析时依赖解析器,它除了支持Python标准库中的HTML解析器外,还支持一些第三方解析器,总结如表所示。BeautifulSoup介绍(3)BeautifulSoup的基本使用由于BeautifulSoup库是用于解析HTML文件的,所以为了演示BeautifulSoup的使用,我们首先新建一个简单的HTML文件test.html,如下图所示。BeautifulSoup介绍BeautifulSoup4能将复杂HTML文档转换为复杂树形结构,其中每个节点都是Python对象,这些对象可归纳为Tag、NavigableString、BeautifulSoup和Comment这四种。Tag:可简单理解为HTML标签,能通过BeautifulSoup对象加标签名获取,但这种方式查找的是所有内容中第一个符合要求的标签。NavigableString:是标签的内容,通过“.string”可获取。BeautifulSoup对象:代表文档的全部内容,可看作特殊的Tag。Comment对象:代表注释内容,是特殊类型的NavigableString,输出内容时不包含注释符号,解析含注释内容的文件时使用前最好先做判断。BeautifulSoup介绍接下来对对上述test.html文件进行解析,如右图所示。代码的运行结果如下图所示。BeautifulSoup介绍我们可以使用type()方法查看Tag、NavigableString、BeautifulSoup和Comment的具体类型,如右图所示。BeautifulSoup介绍(4)BeautifulSoup遍历文档树常用属性/方法在使用BeautifulSoup遍历文档树时,可以获取父节点、子节点、兄弟节点等,相关属性/方法总结如表所示。案例【案例描述】近年来电影产业迅速发展,电影已成为艺术与娱乐的载体,与电影相关的数据越来越多,豆瓣作为中国最大的电影分享与评论社区,收录了百万条影片和影人的资料,记录千万影迷的观影感受,可为观影提供决策。【案例要求】本案例主要目的是获取豆瓣Top250电影,共有10页,首先获取每页网页链接要求爬取每部电影的中文名称、评分、评分人数和导演、主演等相关信息,如下图所示。案例本章回顾1.【多选】模块的导入方式有()。A.import语句B.from…import语句C.from…import*语句 D.import…in语句2.【多选】关于模块的描述正确的有()。A.模块就是一个包含了许多功能/方法的文件B.每一个.py文件都可以被当成是一个模块C.模块可以包含直接运行的代码块、类、函数或这几种的组合D.可以使用“from…import*语句”导入一个模块的所有内容3.【多选】关于模块、包和库的描述,以下正确的有()。A.库是为了方便管理与安装,将能够实现某一功能的模块和包封装而成的集合B.包是由模块及子包、子包下的子包等组成的Python应用环境C.简单理解包就是文件夹,该文件夹下可以不包含“__init__.py”文件D.根据库是否已经包含在Python官方安装包中,可以将其分为标准库和第三方库本章回顾4.以下不属于Python标准库的模块是()。A.requests B.re C.math D.time5.以下关于正则表达式的描述错误的是()。A.正则表达式是用于匹配字符串中字符组合的模式B.正则表达式可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等C.正则表达式主要由普通字符、元字符、重复限定符等组成D.正则表达式不能是单个字符6.关于正则表达式的元字符,以下描述错误的是()。A.字符“^”用于匹配字符串的开始B.字符“\d”用于匹配个数字字符C.字符“\s”用于匹配任意非空白字符D.字符“\w”用于匹配字母、数字、下划线或汉字本章回顾7.关于正则表达式的重复限定符,以下描述错误的是()。A.字符“{n}”用于匹配前面的字符n次B.字符“+”用于匹配前面的字符零次或多次C.字符“{n,}”用于匹配前面的字符至少n次D.字符“+”匹配前面的字符一次或多次8.关于日期和时间模块,以下描述错误的是()。A.在time模块中时间表现的格式主要有时间戳、时间元组、格式化时间三种B.datatime模块在time模块基础上重新进行了封装C.datatime模块中的date类用于表示日期D.datatime模块中的time类用于表示日期和时间9.以下关于爬虫的相关描述,错误的是()。A.网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本B.由于网络爬虫主要是爬取网页的数据,所以需要了解一些网页基础知识C.网络爬虫的一般流程可总结为网页下载、网页解析和数据存储三部分D.在网页下载环节,可以使用Urllib,Requests和BeautifulSoup本章回顾10.以下关于Requests库的描述,错误的是()。A.Requests是基于Urllib开发的B.Request是Python标准库C.Request中的get()方法,用于使用get方式发送请求D.使用Request发送请求时,可以携带headers信息11.以下关于BeautifulSoup的描述,错误的是()。A.BeautifulSoup是一个解析HTML/XML文件的第三方库B.使用BeautifulSoup时不需要考虑编码方式C.可以使用“importBeautifulSoup”进行导入D.BeautifulSoup在解析时依赖解析器12.请列举3个Python常用的标准库模块。期待您的宝贵意见Python程序设计教学团队第七章异常处理与文件操作Python程序设计01异常处理02文件操作03本章回顾异常处理与文件操作程序设计要求程序有健壮性,但运行时存在导致程序不能正常运行的不确定因素,为增强交互性和便于诊断错误,要将不确定因素解释为异常并处理。在实际开发中异常处理必不可少,文件操作使用频率高(包括读写、复制等)且操作过程中常需异常处理,因此将二者放在一章介绍。01异常处理
异常是在程序运行过程中,影响程序正常执行的一个事件。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。本节将对常见的内置异常、异常处理语句和自定义异常进行介绍。Python常用内置异常我们之前遇到的NameError、SyntaxError、TypeError等都是异常,Python常见的内置异常总结如表所示。Python中异常继承关系Python中所有异常的基类是BaseException,所有常规错误的基类是Exception,所有的警告基类是Warning,主要异常类的继承关系如下图所示。异常处理语句在程序开发过程中,有些异常是在输入不合法时才会出现,此时我们可以对可能出现异常的情况进行处理。Python中异常处理的语句有try...except、try...except...else和try...except...finally三种。1.try...except语句捕捉异常可以使用try...except语句,try语句块用来检测错误,except语句捕获异常信息并处理。在使用时,try语句块中放入可能发生错误的代码,except语句块中放入处理结果,当try语句块中代码出现错误时就执行except语句块中的代码,若try语句块中代码没有出现错误则except语句块中的代码不会执行。异常处理语句
(1)语法格式与参数说明try...except语句的语法格式如下:参数说明如表所示。异常处理语句(2)try...except语句的使用接下来我们演示try...except语句的使用,首先定义一个计算销量的函数count(),如下所示。如果没有做任何异常处理,当输入单价为0时,将引发“ZeroDivisionError”异常,如右图所示。异常处理语句此时我们使用try...except语句进
行异常处理,将count()方法放到try语句块中,将发生错误的提示信息放到except中,如下图所示。
运行【代码7-1】,此时再将price输入为0,将不会出现“ZeroDivisionError”异常,而是输出except中的提示信息,结果如下图所示。异常处理语句(3)多异常处理目前我们只处理了“ZeroDivisionError”异常,由于在定义count()函数时,price参数的类型时int,若输入小数,将会引发“ValueError”异常,如下图所示。异常处理语句此时我们可以再一个except语句对ValueError异常进行处理,如右图所示。从右图中可以看出,此时若再将price输入为小数,将不会出现“ValueError”异常,而是打印except中的提示信息。异常处理语句2.try...except...else语句与try...except...finally语句在上述异常处理语句try...except基础上,还可以增加else语句和finally语句,else语句的作用是当try语句中没有出现异常时执行,finally语句是无论程序运行中是否发生异常都会执行。try...except语句、try...except...else语句和try...except...finally语句的执行逻辑如右图所示。异常处理语句还是上面的案例,在上诉代码的基础上增加else语句块和finally语句块,如右图所示。异常处理语句上图代码的运行结果可总结如下图所示。自定义异常在程序开发过程中,当使用标准内置异常不能满足业务需求时,就需要自定义异常。自定义异常需要直接或者间接继承“Exception”异常类,然后使用raise语句抛出异常。自定义异常的应用举例如右图所示。自定义异常上诉代码的运行结果如下图所示。02文件操作由于大部分数据都是通过文件进行存储的,所以文件操作在程序开发过程中是比较重要的一部分,也是程序员必须掌握的知识点。本节将介绍Python内置文件对象File的基本操作和Excel文件的基本操作。文件基本操作1.文件分类我们在日常生活或工作中接触的文件类型有很多,如Word文件、PPT文件、音频文件、视频文件等。而无论何种类型的文件,在内存或磁盘上最终都是以二进制编码存储的。所以根据逻辑上编码的不同,文件只分为文本文件和二进制文件两类。(1)文本文件文本文件存储的是人类可以直接阅读的字符,采用的是字符编码,如ASCII、Unicode编码、GBK、UTF-8等。文本文件经过编解码过程就可以转换成人类理解的信息,编码过程就是将字符转换成二进制,解码过程就是将二进制还原成字符。文件基本操作(2)二进制文件二进制文件存储的是字符以外的其它信息,包括图片、声音、视频等,采用的是值编码,以字符串的形式存储。二进制文件是按照一定的规则,把信息转换成二进制存储到文件中,但由于图片、声音、视频格式转换比较复杂,而且各有各的标准,所以为了简化将其归为一类。2.文件的打开和关闭(1)文件打开函数在Python中,想要操作文件首先需要打开并创建一个文件对象,通过open()函数即可实现文件打开,其语法格式如下:文件基本操作参数说明如右表所示。参数“access_mode”
的取值如右表所示。文件基本操作文件基本操作参数“buffering”的取值如表所示。
正常情况下,程序运行在内存中,而缓冲区就是一个内存空间,它可以视为一个FIFO(先进先出)队列,当缓冲区达到阈值或者满了的时候,数据会被flush到磁盘。需要注意的是,对于参数“buffering”一般建议使用默认的缓冲区设置,除非明确知道缓冲区所需大小。文件基本操作(2)文件关闭函数文件打开之后,需要及时进行关闭,通过close()函数即可实现文件关闭,其语法格式如下:其中file代表之前打开的、待关闭的文件对象。文件操作一般需要和异常处理语句结合使用,而close()函数一般会放在finally语句块中。close()函数运行时会先刷新缓冲区还没写入的信息,然后再关闭文件。文件基本操作(3)文件打开和关闭的应用接下来我们演示一下文件打开和闭关函数的使用,首先在JupyterNotebook中新建一个文本文件,如右图所示。然后将新建的文件重命名为“test.txt”,并编辑一些文本内容,如右图所示。文件基本操作此时可以使用代码“file=open('test.txt')”打开文件,然后访问file对象,运行结果如右图所示。从上图中可以看出,由于我们没有传递参数“access_mode”,所以是采用默认方式“r”(只读)打开,编码是“cp936”。如果我们想使用编码“utf-8”打开,可以使用代码“file=open('test.txt',encoding='utf-8')”,此时再访问file文件,编码即变为了“utf-8”,如右图所示。文件基本操作有了文件对象之后,还可以通过mode、name、closed属性分别获取打开模式、名字和是否已经关闭信息,如右图所示。如果我们打开一个不存在的文件,将会出现“FileNotFoundError”异常,如右图所示。文件基本操作此时可以将打开文件进行异常处理,并在finally语句中进行文件关闭,如右图所示。文件基本操作上诉代码的运行结果分别如图1和图2所示。文件基本操作3.文件读写Python中的file对象提供了一些方法用于对文件进行读写,常用的总结如表所示。文件基本操作以下是一个读写文件的小案例。下图代码的运行结果如下图所示。文件基本操作需要注意的是,在读写模式下如果是先写后读,写入后由于文件指针会移动到文件尾,想要读取文件内容需要将文件指针移动到文件头位置(f.seek(0))。运行完上图代码之后,由于我们之前没“test1.txt”文件,在“w+”读写模式下,如果文件不存在,会创建一个新文件,此时可发现JupyterNotebook中多了一个文件“test1.txt”,文件的内容如下图所示。文件基本操作上诉代码中是使用的read()函数读取数据,接下来分别使用readline()和readlines(),查看它们之间的区别,如下图所示。使用os模块操作文件及目录Python中的os模块及其子模块os.path提供了一些方法用来处理文件和目录。1.文件处理os模块分别提供了rename()函数和remove()函数来重命名和删除文件,rename()函数主要传递两个参数,第一个参数是文件原名,第二个参数为文件的新名字,其语法格式如下:使用os模块操作文件及目录remove()函数的参数就是待删除文件的路径,如想要删除上面重命名后的“test2.txt”文件,可使用代码“os.remove('test2.txt')”。
如我们要将前面代码中的文件“test1.txt”重命名为“test2.txt”,可使用代码“os.rename('test1.txt','test2.txt')”,如下图所示。使用os模块操作文件及目录2.目录操作(1)创建目录os模块中最基础的用于创建目录的函数是os.mkdir(path),如我们想在E盘下新建一个目录test,可使用代码“os.mkdir('E:\\test')”,但若使用此方法时,E盘已存在test目录,此时会报错,如下图所示。使用os模块操作文件及目录遇到此种情况,可先使用os.path.exists(path)函数判断目录是否存在,当目录不存在时再进行创建,如右图所示。此时运行代码,结果如右图所示。使用os模块操作文件及目录创建的目录可以在指定路径下查看,如下图所示。使用os模块操作文件及目录(2)创建多级目录上述的mkdir()函数用于创建一级目录,如果给定的目录有多级,且最后一级的上级目录不存在,使用mkdir()函数会出现FileNotFoundError异常,如下图所示。使用os模块操作文件及目录此时可以使用os.makedirs(path)函数递归创建多级目录,如下图所示。使用os模块操作文件及目录(3)删除目录删除目录可以使用os.rmdir(path)函数,但是需要注意的是,此函数只能删除空目录,如我们删除前面代码中创建的目录“E:\\test\\test1”,代码为“os.rmdir('E:\\test\\test1')”,运行此代码后,再次查看test文件夹,已经为空了(代表删除成功),如下图所示。使用os模块操作文件及目录此时如果我们在test中新建一个“test.txt”文件,此时再删除test文件夹,会出现OSError错误,如下图所示。(1)
遍历目录使用os模块中的walk()函数可以获取指定目录下的所有目录及文件,其语法格式如下:使用os模块操作文件及目录参数说明如表所示。接下来对walk()函数的使用进行举例,假设有一个目录结构如右图所示。使用os模块操作文件及目录遍历上图中目录的代码如右图所示。右图代码的运行结果如右图所示。使用os模块操作文件及目录上图的运行遍历结果显示得并不友好,为了看起来更舒适,可结合拼接路径函数os.path.join()实现更好的展示效果,如右图所示。上诉代码的运行结果如下图所示。使用os模块操作文件及目录3.
常用方法总结除了上述介绍的文件处理和目录操作的相关方法,os模块和其子模块os.path还提供了获取当前工作目录、获取绝对路径等方法,为了方便大家记忆,现将常用的方法总结如表所示。Excel文件操作在开发过程中,经常需要处理Excel文件,Python中提供了一些用于处理excel文件的第三方模块。使用xlwt模块对以“.xls”为后缀(2003以前的版本)的表格文件进行写入。使用xlrd模块对以“.xls”为后缀(2003以前的版本)的表格文件进行读取。xlutils模块可以实现xlwt和xlrd之间的转换。使用openpyxl模块实现对以“.xlsx”为后缀(2007以后的版本)的表格文件的读写。Excel文件操作1.使用xlwt模块实现写入xls文件使用xlwt模块写入xls文件一般需要5个步骤,如右图所示。Excel文件操作接下来举例说明,如右图所示。Excel文件操作运行上图代码,查看E盘,发现其下已经多了一个“test.xls”文件,打开此文件查看内容,如右图所示。Excel文件操作在写入文件时,还可以进行列宽、行高、居中等设置,我们将之前的案例进行改造,如下图所示。Excel文件操作运行代码,得到新的文件“test.xls”,内容如下图所示。和前图相比,上图中的行高、列宽都有了变化,且数据已居中显示。Excel文件操作2.使用xlrd模块读取xls文件使用xlrd模块读取xls文件可总结为4步,如右图所示。Excel文件操作接下来读取前面代码中生成的“test.xls”文件,如下图所示。Excel文件操作上诉代码的运行结果如下图所示。Excel文件操作3.使用xlutils模块实现xlwt和xlrd之间的转换由于使用xlrd模块中的open_workbook()函数读取xls文件返回的“xlrd.book.Book”类型的对象是只读的,不能对其进行修改。而如果我们想要实现读取xls文件后对其进行修改,就要借助于xlutils模块。如果此Python环境中没有xlutils模块,可以使用命令“pipinstallxlutils”进行安装,如下图所示。Excel文件操作xlutils.copy模块的copy()方法可以将“xlrd.book.Book”类型转换为xlwt模块中的“xlwt.Workbook.Workbook”类型,如下图所示。Excel文件操作接下来举一个读取xls文件,然后修改保存的例子,如下图所示。Excel文件操作运行上图代码,发现E盘多了一个文件“test2.xls”,打开发现其有两个工作表,其内容如下图所示。Excel文件操作4.使用openpyxl模块进行xlsx文件的读写对于xlsx格式的Excel文件读写可以使用第三方模块openpyxl实现。(1)使用openpyxl写入xlsx文件使用openpyxl写入xlsx文件的思路与上文介绍的使用xlwt模块写入xls文件类似,都是首先导入模块,然后创建工作薄、工作表、写入数据,最后保存到指定文件,举例如右图所示。Excel文件操作运行上图代码,发现E盘多了一个文件“test3.xlsx”,其有两个工作表,内容下图所示。Excel文件操作与写入xls文件时类似,在写入xlsx文件时也可以设置行高、列宽、对齐方式等,如右图所示。Excel文件操作运行上诉代码之后,打开E盘下的“test4.xlsx”文件,内容如下图所示。Excel文件操作(2)openpyxl模块相关属性介绍上述案例中我们主要用到的是openpyxl模块的Workbook、Worksheet和Cell对象,其常用属性总结如表所示。Excel文件操作(3)使用openpyxl读取xlsx文件使用openpyxl读取xlsx文件的思路与上文介绍的使用xlrd模块读取xls文件类似,都是首先导入模块,然后获取工作薄、工作表,最后获取工作表中的内容,举例如右图所示。Excel文件操作上诉代码的运行结果如下图所示。案例【案例描述】GDP(GrossDomesticProduct),即国内生产总值,是一个国家(或地区)所有常住单位在一定时期内生产活动的最终成果。GDP是国民经济核算的核心指标,也是衡量一个国家或地区经济状况和发展水平的重要指标。现有一份表格中记录了187个国家从2000年至2017年的的GDP数据(单位:万亿元),如图7-42所示。案例【案例要求】由于表中数据较多,为了方便查看,现设计一个程序用于从当前数据表中提取某个国家的GDP信息到新的工作表中,提取后可以适当进行格式处理。【实现思路】①读取表格中数据。②根据需求获取某个国家的GDP信息。③将获取到的某个国家GDP信息保存到一个新的工作表中。④可在其中结合异常处理的方法。案例【案例代码】案例
【运行结果】运行上图代码,在输入框中输入中国,控制台输出结果如图所示。案例E盘中的gdp3.xlsx内容如右图所示。03本章回顾本章共分为两小节内容,第一小节主要介绍异常处理,包括异常概述、异常处理语句和自定义异常。第二小节主要介绍文件操作,包括文本文件的操作、二进制文件的操作、Excel文件操作等内容。本章回顾【综合练习】1.【多选】Python中的异常处理语句包括()。A.try...except语句B.try...except...else语句C.try...except...finally语句D.try…catch语句2.【多选】以下关于Python异常的描述,正确的有()。A.异常是在程序运行过程中,影响程序正常执行的一个事件B.BaseException是所有异常的基类C.Exception是所有异常的基类D.RuntimeError代表一般的运行时错误本章回顾3.【多选】以下关于Python异常处理语句的描述,正确的有()。A.在Python中,捕捉异常可以使用try...except语句B.try语句块用来检测错误C.except语句用于捕获异常信息并处理D.finally语句是无论程序运行中是否发生异常都会执行4.【多选】根据逻辑上的编码不同,文件可分类为()。A.文本文件 B.图片 C.二进制文件 D.视频文件本章回顾5.关于文件基本操作,以下描述错误的是()。A.open()函数用于打开文件B.c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新学期-新希望主题班会课件
- 2022年河北省张家口市第二十中学中考模拟英语试题(解析版)
- 2025年交运行业年度策略之:供给刚性持续期待需求意外
- 拼搭玩具行业深度:IP与玩法融合稀缺供给高成长
- 高速梭绣制品行业行业发展趋势及投资战略研究分析报告
- 2025年中国网络视频监控系统市场竞争格局及投资战略规划报告
- 废矿物油综合处置项目可行性研究报告项目申请报告
- 2019-2025年中国无人货架行业竞争格局分析及投资战略咨询报告
- 中国汽车电源行业发展趋势及投资前景预测报告
- 细胞美胸霜行业深度研究报告
- 工程机械租赁服务方案及保障措施范本
- 国有建设企业《大宗材料及设备采购招标管理办法》
- 民间秘术绝招大全
- 水运工程质量检验标准(JTS_257-2008)附表格
- 春节停工报告完整版3页
- (完整版)展厅展馆博物馆美术馆设计标招标评分细则及打分表
- [宋小宝小品甄嬛后传台词]甄嬛歪传小品剧本台词范本
- 扭扭棒手工PPT课件
- 曲式分析演唱技巧情感运用
- 古建筑白蚁危害及防控现状
- 建筑装饰装修施工组织设计方案(完整版)
评论
0/150
提交评论