《Python程序设计基础》 课件第6章 数据处理_第1页
《Python程序设计基础》 课件第6章 数据处理_第2页
《Python程序设计基础》 课件第6章 数据处理_第3页
《Python程序设计基础》 课件第6章 数据处理_第4页
《Python程序设计基础》 课件第6章 数据处理_第5页
已阅读5页,还剩98页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章数据处理文件I/OJSON和XML解析CSV和Excel高效解析异常思维导图学习目标掌握掌握掌握掌握Python文件的读取和写入12理解JSON和XML的解析了解异常的抛出及捕捉

4理解CSV和Excel

的解析

3技能目标掌握掌握掌握熟练掌握目录的操作及文件的读取和写入操作12学会JSON和XML的基本编程应用基本掌握异常的编程应用4学会访问CSV和Excel文件的编程应用

3思政目标1.数据处理时要考虑数据安全和隐私保护,遵纪守法是一名IT从业者的基本品质。2.出现异常和错误不可怕,重要的是要有解决问题和纠正错误的能力。3.通过“‘银河麒麟’:夯实信息安全的‘中国地基’”的学习,深刻理解“一个国家在信息安全领域才能掌握自己的话语权,掌握核心技术才能够实现自主发展”的深刻内涵目录JSON和XML解析6.26.1文件I/O6.3CSV和Excel的高效解析6.4异常知识架构6.1文件I/O1目录的操作2文件读取3文件写入4学生实践练习6.1

文件I/O1

目录的操作

Python程序使用自带的os模块操作目录。os模块包含的函数见表6.1。6.1

文件I/O1

目录的操作

6.1

文件I/O1

目录的操作

【示例6.1】统计Python安装目录下子目录和文件的数量。importos#统计某个目录下的目录和文件defstatisticsFile(dir,dict):dir=dir+"\\"dirList=os.listdir(dir)#获取dir目录下所有目录和文件名fordirItemindirList:path=dir+dirItemifos.path.isdir(path):#判断该文件是否是一个目录dict["dir"]=dict["dir"]+1statisticsFile(path,dict)else:dict["file"]=dict["file"]+1dict={"dir":0,"file":0}#将目录个数和文件个数保存在字典对象中statisticsFile("E:\\Python27",dict)print("目录个数为:%d,文件个数为:%d"%(dict["dir"],dict["file"]))6.1

文件I/O1

目录的操作

统计Python安装目录下子目录和文件的数量,运行结果如图6.1所示。6.1文件I/O2

文件读取

文件对象名=open(file_name[,access_mode][,buffering])file_name:该参数指要访问的文件名称对应的字符串。access_mode:决定了打开文件的模式,包括只读、写入和追加等。buffering:buffering的值被设为0,就不会有寄存。取1,访问文件时会寄存行。设为大于1的整数,表明了这就是寄存区的缓冲大小。取负值,寄存区的缓冲大小则为系统默认。6.1文件I/O2

文件读取

文件打开的模式详情见表6.2。6.1文件I/O2

文件读取

文件打开后,会产生一个file对象,通过file对象可以得到有关该文件的各种信息。与file对象相关的所有属性见表6.3。6.1文件I/O2

文件读取

【示例6.2】获取Python程序当前目录下的test.txt文件的各种信息。importoscurPath=os.getcwd()#获取当前目录#打开一个文件fileObject=open(curPath+"\\test.txt","r+")print("文件名:",fileO)print("是否已关闭:",fileObject.closed)print("访问模式:",fileObject.mode)#关闭文件fileObject.close()6.1文件I/O2

文件读取

查看运行结果6.1文件I/O2

文件读取

在Python中,打开文件除了open()函数的常规使用方式,还可以联合with一起使用,例如,改写示例6.2的代码如下:importoscurPath=os.getcwd()#获取当前目录#打开一个文件withopen(curPath+"\\test.txt","r+")asfileObject:print("文件名:",fileO)print("是否已关闭:",fileObject.closed)print("访问模式:",fileObject.mode)6.1文件I/O2

文件读取

其运行结果与前者的结果相同。使用open()函数和withopen()asfile之间除格式不同外,还有一个最大的区别是前者open()函数打开文件后,需要显式调用file.close()关闭;后者withopen()asfile则无须显式调用函数关闭文件。一般情况下,推荐使用后者。6.1文件I/O2

读取文件使用file对象的read()函数,该函数从一个打开的文件中读取一个字符串。需要注意的是,Python字符串可以是二进制数据,而不仅仅是文字。

被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取内容,很可能是直到文件的末尾。fileObject.read([count])【注意】在读取或写入文件后,需要使用file对象的close()函数刷新缓冲区里任何还没写入的信息,并关闭该文件。关闭之后不能再进行读取和写入操作。6.1文件I/O2

文件读取

【示例6.3】读取Python程序当前目录下的test.txt文件内容。importoscurPath=os.getcwd()#获取当前目录#打开一个文件#设置编码格式为UTF-8,避免乱码fileObject=open(curPath+"\\test.txt","r+",encoding='UTF-8')str=fileObject.read()print("读取的字符串为:"+str)fileObject.close()#关闭打开的文件6.1文件I/O2

文件读取

读取test.txt文件内容的运行结果如图6.1文件I/O3

文件写入

fileObject.write(string)

Python程序中文件写入是通过文件对象中的write()函数实现的。

write()函数可以将任何字符串写入一个打开的文件中。Python字符串可以是二进制数据,不限于文字。6.1文件I/O3

文件写入

【示例6.4】将字符串“测试内容写入”写入当前目录的test.txt文件中。importoscurPath=os.getcwd()#使用open()函数打开文件并返回一个文件对象fileObject=open(curPath+"\\test.txt","w+")fileObject.write("测试内容写入")#写入文件内容fileObject.close()#关闭文件6.1文件I/O3

文件写入

写入字符串到test.txt文件中的运行结果如图6.1文件I/O1.需求说明

输入一个文件目录。在该目录的同一级目录中新建一个目录,新建目录名称以“该文件目录名+copy”的形式命名。将目录中的所有子目录和文件复制到新建的目录当中。2.实现思路(1)定义一个复制目录的方法copyDir()(2)定义一个复制文件的方法copyFile()(3)定义一个方法获取目录下所有的目录和文件。如果是文件,则直接将其复制到对应目录下。如果是目录,则在新建目录的对应位置创建一个目录,并递归调用该方法。4

学生实践练习

知识架构6.2

JSON和XML解析1JSON字符串和Python对象的转换2XML解析3学生实践练习6.2JSON和XML解析1

JSON字符串和Python对象的转换

JSON数据的书写格式(1)名称/值对表现形式,如字符串{"name":"json","age":10,"address":"USA"}。(2)数组表现形式,如字符串{"person":[{"name":"json","age":10,"address":"USA"},{"name":"html","age":15,"address":"USA"}]}。6.2JSON和XML解析1

JSON字符串和Python对象的转换json.dumps(obj,skipkeys=False,ensure_ascii=True,check_circular=True,allow_nan=True,cls=None,indent=None,separators=None,encoding="utf-8",default=None,sort_keys=False,**kw)

Python程序提供了JSON库用于JSON字符串和Python对象之间的相互转换,因此转换前需要使用importjson语句导入JSON库,其中json.dumps()函数用于将Python对象编码成JSON字符串。6.2JSON和XML解析【示例6.5】将两种类型的对象,转换为JSON数据格式字符串的方式。1

JSON字符串和Python对象的转换importjsonlist=[4,6,13,10,12]jsonStr=json.dumps(list)print("转换后类型为%s,值为%s"%(type(jsonStr),jsonStr))dict={"name":"json","age":10,"address":"USA"}jsonStr2=json.dumps(dict)print("转换后类型为%s,值为%s"%(type(jsonStr2),jsonStr2))6.2JSON和XML解析转换为JSON数据格式字符串的运行结果1

JSON字符串和Python对象的转换6.2JSON和XML解析1

JSON字符串和Python对象的转换

json.loads(str,encoding=None,cls=None,object_hook=None,parse_float=None,parse_int=None,parse_constant=None,object_pairs_hook=None,**kw)JSON库中提供了json.loads()函数,用于将JSON字符串转换成Python对象。6.2JSON和XML解析1

JSON字符串和Python对象的转换

【示例6.6】将两种类型的对象转换为JSON数据格式字符串的方式。importjsonjsonData='{"name":"json","age":10,"address":"USA"}';obj=json.loads(jsonData)foriteminobj:#循环输出字典对象中的元素print("%s=%s"%(item,obj[item]),end="\t")print("")#换行jsonData2='''[{"name":"json","age":10,"address":"USA"},{"name":"html","age":15,"address":"USA"}]'''obj=json.loads(jsonData2)print("类型为%s\n值为%s"%(type(obj),obj))6.2JSON和XML解析1

JSON字符串和Python对象的转换

JSON字符串转换成Python对象的运行结果6.2JSON和XML解析2

XML解析

Python有三种解析XML的方式,分别为SAX、DOM及ElementTree。

XML是一套定义语义标记的规则,同时也是用于定义其他标识语言的无标识语言。6.2JSON和XML解析2

XML解析

SAX(SimpleAPIforXML)是一种基于事件驱动的API。利用SAX解析XML文档,包含解析器和事件处理器两个部分。

使用SAX方式进行解析,主要适应于以下三个场景:对大型文件进行处理。只需要文件的部分内容,或者只需从文件中得到特定信息。想建立自己的对象模型的时候。1.SAX6.2JSON和XML解析2

XML解析

在Python中使用SAX方式处理XML,要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。其中,ContentHandler类的方法见表6.4。6.2JSON和XML解析2

XML解析

(1)定义一个类MovieHandler继xml.sax.ContentHandler类,分别重写ContentHandler类中的元素开始事件处理函数startElement(name,attrs)、元素结束事件处理函数endElement(name)及内容事件处理函数characters(content)。在这三个函数中分别获取解析后的内容。SAX方式解析的步骤6.2JSON和XML解析2

XML解析

(2)使用xml.sax.make_parser()函数创建一个新的解析器对象并返回(3)使用解析器对象的setFeature()函数关闭命名空间(4)创建第一个步骤中MovieHandler类的对象xml.sax.make_parser([parser_list])#parser_list为可选参数,解析器列表parser.setFeature(xml.sax.handler.feature_namespaces,0)Handler=MovieHandler()6.2JSON和XML解析2

XML解析

(5)使用解析器对象parser中的setContentHandler()函数,设置内容处理器,传入第3个步骤中创建的MovieHandler类的对象(6)使用解析器对象parser中的parse()函数解析XML文档parser.setContentHandler(Handler)parser.parse("movie.xml")6.2JSON和XML解析2

XML解析

保存电影数据的movie.xml文件,代码如右:<?xmlvd"><type>War,Thriller</type><format>DVD</format><year>2003</year>ersion="1.0"?><collectionshelf="NewArrivals"><movietitle="EnemyBehin<rating>PG</rating><stars>10</stars><description>TalkaboutaUS-Japanwar</description></movie><movietitle="Transformers"><type>Anime,ScienceFiction</type><format>DVD</format><year>1989</year><rating>R</rating><stars>8</stars><description>Aschientificfiction</description></movie></collection>6.2JSON和XML解析2

XML解析

【示例6.7】使用SAX方式解析该XML文件。importxml.saxclassMovieHandler(xml.sax.ContentHandler):def__init__(self):self.CurrentData=""self.type=""self.format=""self.year=""self.rating=""self.stars=""self.description=""#元素开始事件处理defstartElement(self,tag,attributes):self.CurrentData=tagiftag=="movie":print("*****Movie*****")title=attributes["title"]print("Title:",title)6.2JSON和XML解析2

XML解析

#元素结束事件处理defendElement(self,tag):ifself.CurrentData=="type":print("Type:",self.type)elifself.CurrentData=="format":print("Format:",self.format)elifself.CurrentData=="year":print("Year:",self.year)elifself.CurrentData=="rating":print("Rating:",self.rating)elifself.CurrentData=="stars":print("Stars:",self.stars)elifself.CurrentData=="description":print("Description:",self.description)self.CurrentData=""6.2JSON和XML解析2

XML解析

#内容事件处理defcharacters(self,content):ifself.CurrentData=="type":self.type=contentelifself.CurrentData=="format":self.format=contentelifself.CurrentData=="year":self.year=contentelifself.CurrentData=="rating":self.rating=contentelifself.CurrentData=="stars":self.stars=contentelifself.CurrentData=="description":self.description=content6.2JSON和XML解析2

XML解析

#创建一个XMLReaderparser=xml.sax.make_parser()#turnoffnamepsacesparser.setFeature(xml.sax.handler.feature_namespaces,0)#重写ContextHandlerHandler=MovieHandler()parser.setContentHandler(Handler)parser.parse("movie.xml")6.2JSON和XML解析2

XML解析

使用SAX方式解析该XML文件的运行结果如图6.9所示。6.2JSON和XML解析2

XML解析

DOM(DocumentObjectModel)方式将XML数据在内存中解析成一棵树,通过对树的操作来操作XML。一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后可以利用DOM提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入XML文件。因DOM需要将XML数据映射到内存中的树,相对比较慢,也比较耗内存,对需要频繁使用的XML文件可以使用该方式。DOM方式使用xml.dom.minidom模块来解析XML文件。2.DOM6.2JSON和XML解析2

XML解析

【示例6.8】使用DOM方式解析该XML文件fromxml.dom.minidomimportparseimportxml.dom.minidom#使用minidom解析器打开XML文档DOMTree=xml.dom.minidom.parse("movie.xml")collection=DOMTree.documentElementifcollection.hasAttribute("shelf"):#判断是否有shelf属性print("根节点:%s"%collection.getAttribute("shelf"))#在集合中获取所有电影movies=collection.getElementsByTagName("movie")6.2JSON和XML解析2

XML解析

#打印每部电影的详细信息formovieinmovies:print("*****Movie*****")ifmovie.hasAttribute("title"):print("Title:%s"%movie.getAttribute("title"))type=movie.getElementsByTagName('type')[0]print("Type:%s"%type.childNodes[0].data)format=movie.getElementsByTagName('format')[0]print("Format:%s"%format.childNodes[0].data)rating=movie.getElementsByTagName('rating')[0]print("Rating:%s"%rating.childNodes[0].data)description=movie.getElementsByTagName('description')[0]print("Description:%s"%description.childNodes[0].data)6.2JSON和XML解析2

XML解析

使用DOM方式解析该XML文件的运行结果6.2JSON和XML解析2

XML解析

【注意】因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件速度比较快,占用内存少,但需要用户实现回调函数(handler)。

ElementTree(元素树)就像一个轻量级的DOM,具有方便友好的API,代码可用性好,速度快,消耗内存少。3.ElementTree6.2JSON和XML解析2

XML解析

【示例6.9】使用ElementTree的方式解析XML文件。fromxml.etreeimportElementTreeroot=ElementTree.parse('movie.xml').getroot()movies=root.findall('.//movie')#查找所有根节点下的所有movie节点formovieinmovies:print("*****Movie*****")print('Title属性:'+movie.attrib.get('title'))#获取movie节点的title属性#使用XPath语法获取type节点对象e_type=movie.find('.//type')ife_type!=None:print(e_type.tag+':'+e_type.text)forsubElementinlist(movie):#循环遍历movie标签下的所有子节点print('\t'+subElement.tag+':'+subElement.text)6.2JSON和XML解析2

XML解析

使用ElementTree的方式解析XML文件的运行结果如图6.11所示。6.2JSON和XML解析2

XML解析

ElementTree解析方式有限支持XPath表达式,只支持其中一部分语法,不适用于完整的XPath工程。通过XPath表达式解析XML内容代码见以下fromxml.etreeimportElementTreetree=ElementTree.parse('movie.xml')root=tree.getroot()print("标签",root.tag,"属性为",root.attrib)forchildinroot:print("标签",child.tag,"属性为",child.attrib)formovieChildinchild:print("movie子节点标签",movieChild.tag,"内容为",movieChild.text)6.2JSON和XML解析2

XML解析

通过XPath表达式解析XML内容的运行结果6.2JSON和XML解析

解析以XML方式保存的省份及对应的城市列表数据,将解析后的数据以JSON字符串的形式输出。省份及对应的城市列表数据保存在province.xml中,格式如右:需求说明<?xmlversion="1.0"?><countryname="中国"><provincename="湖南"><city>长沙</city><city>衡阳</city><city>湘潭</city><city>株洲</city></province><provincename="湖北"><city>武汉</city><city>宜昌</city><city>黄石</city></province></country>3

学生实践练习

6.2JSON和XML解析实现思路:(1)将XML数据保存到工程的province.xml文件中。(2)定义数据处理类ProvinceHandler并继承xml.sax.ContentHandler类。该类包含CurrentData(当前数据)、city(当前解析的城市)、province(当前解析的省份)及provinceDict(保存最后结果的字典对象)四个属性。分别重写ContentHandler类中的元素开始事件处理函数startElement(name,attrs)、元素结束事件处理函数endElement(name)及内容事件处理函数characters(content)。在这三个函数中分别获取解析后的内容。(3)XML数据解析后使用JSON模块的dumps()将ProvinceHandler对象中的provinceDict属性解析成JSON字符串并输出,注意设置“ensure_ascii=False”以确保输出中文。使用SAX方式解析,转换后的JSON字符串如下:{"湖北":["武汉","宜昌","黄石"],"湖南":["长沙","衡阳","湘潭","株洲"]}

学生实践练习

3知识架构6.3

CSV和Excel的高效解析1CSV的解析2Excel的解析3学生实践练习6.3CSV和Excel的高效解析1

CSV(Comma-SeparatedValues,中文逗号分隔值,有时也称字符分隔值)是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用,也应用于程序之间转移表格数据,而这些程序本身是在不兼容的格式上进行操作的。“CSV”并不是一种单一的、定义明确的格式。在实践中,“CSV”术语泛指具有以下特征的任何文件:纯文本,使用某个字符集,如ASCII、Unicode、EBCDIC或GB2312。由记录组成(典型的是每行一条记录)。每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格每条记录都有同样的字段序列

CSV的解析

6.3CSV和Excel的高效解析1

CSV的解析

Python程序使用CSV模块读写CSV文件,使用reader()函数读取CSV文件csv.reader(csvfile[,dialect='excel'][,fmtparam])dialect:为可选参数,指编码风格,默认为Excel方式,同时支持excel-tab风格(制表符(tab)分隔)。fmtparam:为可选参数,表示格式化参数,用来覆盖之前dialect对象指定的编码风格。1.读取CSV文件6.3CSV和Excel的高效解析1

CSV的解析

在工程的目录上右键单击选择File(文件)菜单,创建users.csv文件在操作系统中双击将会以Excel表格的方式打开,文件内容如下:1,张小明,32,北京2,胡春燕,26,上海【示例6.11】读取创建的users.csv文件,输出到控制台importcsvcsvfile=open('users.csv','r')rd=csv.reader(csvfile)forlineinrd:#循环遍历每一行记录foriteminline:#循环遍历每条记录的所有字段print(item,end="")print("")#换行csvfile.close()6.3CSV和Excel的高效解析1

CSV的解析

读取创建的users.csv文件的运行结果如图6.3CSV和Excel的高效解析1

CSV的解析

打开文件的方式除了使用open()函数,还可以使用withopen()asfile结构因此,示例6.11还可以写成以下形式:importcsv#打开文件,用with打开,可以不用去特意关闭file了withopen('users.csv','r')ascsvfile:#读取CSV文件,返回的是迭代类型rd=csv.reader(csvfile)forlineinrd:#循环遍历每一行记录foriteminline:#循环遍历每条记录的所有字段print(item,end="")print("")#换行6.3CSV和Excel的高效解析1

CSV的解析

writer(csvfile[,dialect='excel'][,fmtparam])在CSV模块中,reader对象还提供了next()函数用于获取下一条记录,如果没有下一条记录,则会抛出异常。CSV模块还提供了writer()函数实现写入操作。2.写入CSV文件参数和reader()函数的参数一致。6.3CSV和Excel的高效解析1

CSV的解析

【示例6.12】将记录写入到users.csv文件中。importcsvcsvfile=open('users.csv','w')writer=csv.writer(csvfile)writer.writerow(['3','彭飞燕','33',"长沙"])data=[('4','小河','25','北京'),('5','小芳','18','北京')]writer.writerows(data)#写入多行记录csvfile.close()6.3CSV和Excel的高效解析1

CSV的解析

写入记录到users.csv文件中的运行结果如图6.15所示。6.3CSV和Excel的高效解析1

CSV的解析

与读取CSV文件相同,除了使用open()函数打开文件,还可以使用withopen()asfile结构,因此,示例6.12可以改写成以下形式:importcsvwithopen('users.csv','w',encoding="utf-8")ascsvfile:writer=csv.writer(csvfile)writer.writerow(['3','彭飞燕','33',"长沙"])data=[('4','小河','25','北京'),('5','小芳','18','北京')]writer.writerows(data)#写入多行记录6.3CSV和Excel的高效解析2

Excel的解析

Excel是微软公司的办公软件MicrosoftOffice的组件之一,可以进行各种数据的处理、统计分析和辅助决策操作,广泛地应用于管理、统计财经和金融等众多领域。6.3CSV和Excel的高效解析2

Excel的解析

Python读写Excel文档需要安装和使用xlrd模块。使用PyCharm工具安装xlrd模块的步骤如下:(1)在PyCharm工具中选择“File”→“Settings”菜单,打开如图所示的界面1.xlrd模块的安装6.3CSV和Excel的高效解析2

Excel的解析

(2)单击右侧的“+”图标,进入添加第三方库的界面,在搜索框中输入“xlrd”搜索xlrd库,第三方库的安装界面如图所示6.3CSV和Excel的高效解析2

Excel的解析

(3)输入搜索的内容后,左侧界面显示相关的第三方库,在这里选择xlrd。选择后单击“InstallPackage”按钮安装xlrd库。安装成功后,在“InstallPackage”按钮上方出现“Package'xlrd'installedsuccessfully”的提示信息脚下留心6.3CSV和Excel的高效解析

有时候出现使用PyCharm不能安装第三方库的问题,可以使用pip命令安装。使用pip命令之前需要将Python安装目录下的Scripts目录添加到Path环境变量中。打开cmd命令行工具,执行“pipinstallxlrd”命令,安装xlrd库,如图所示。6.3CSV和Excel的高效解析2

Excel的解析

2.xlrd模块的使用在系统中打开工程所在目录,创建一个users.xlsx文件。文件内容见表6.3CSV和Excel的高效解析2

Excel的解析

【示例6.13】使用xlrd模块读取users.xlsx中的内容。importxlrddefread_excel():#打开Excel文件读取数据workbook=xlrd.open_workbook('users.xlsx')#获取所有sheetprint(workbook.sheet_names())#sheet2=workbook.sheet_names()[0]#第一种方式,根据下标获取sheet=workbook.sheet_by_index(0)#第二种方式,根据sheet索引获取sheet对象,索引从0开始sheet=workbook.sheet_by_name('Sheet1')#第三种方式,根据sheet名称获取sheet对象#sheet的名称、行数、列数print(,sheet.nrows,sheet.ncols)6.3CSV和Excel的高效解析2

Excel的解析

【示例6.13】使用xlrd模块读取users.xlsx中的内容。#获取整行和整列的值(数组)rows=sheet.row_values(2)#获取第三行内容cols=sheet.col_values(2)#获取第三列内容print(str(rows))print(cols)#获取单元格内容print(sheet.cell(1,0).value,end="")print(sheet.cell_value(1,0),end="")print(sheet.row(1)[0].value,end="")#获取单元格内容的数据类型print(sheet.cell(1,0).ctype)if__name__=='__main__':#类似于Java的main函数,也可以直接调用read_excel()read_excel()6.3CSV和Excel的高效解析2

Excel的解析

使用xlrd模块读取users.xlsx内容的运行结果如图6.19所示。6.3CSV和Excel的高效解析2

Excel的解析

Excel文件写入需要安装xlwt模块,安装方式和Excel文件读取的模块

xlrd的安装相同。【示例6.14】写入用户的信息,并保存为userinfo.xls文件。importxlwt#导入xlwt模块#创建内容的样式对象,包括字体样式及数字的格式style0=xlwt.easyxf('font:nameTimesNewRoman,color-indexred,boldon',num_format_str='#,##0.00')wb=xlwt.Workbook()ws=wb.add_sheet('Sheet1')#添加一个sheet#需要将中文通过u""的形式转换为unicode编码data=[[u"编号",u"姓名",u"年龄",u"地址"],[1,u"张小明",34,u"上海"],[2,u"李建成",31,u"北京"]]foriinrange(0,data.__len__()):#循环遍历每一行forjinrange(0,data[i].__len__()):#循环遍历第i行的每一列ws.write(i,j,data[i][j],style0)wb.save('userinfo.xls')6.3CSV和Excel的高效解析2

Excel的解析

写入用户的信息并保存为userinfo.xls文件的运行结果如图6.20所示。6.3CSV和Excel的高效解析需求说明:

将CSV文件的内容写入另外一个Excel文件中或将Excel文件的内容写入CSV文件中。要求如下:(1)读取product.csv文件的内容,将读取出来的内容保存到

product.xls文件中,product.csv的内容见表6.6。3

学生实践练习

6.3CSV和Excel的高效解析(2)读取employee.xls文件的内容,将读取出来的内容保存到employee.csv文件中。employee.xls文件的内容见表6.7。3

学生实践练习

6.3CSV和Excel的高效解析实现思路:(1)定义一个类名为ExcelUtil的Excel操作工具类,其中包含读取Excel文件的readExcel()方法和Excel文件写入的writeExcel()方法。(2)定义一个类名为CsvUtil的CSV操作工具类。该类包含读取CSV文件的readCSV()方法和CSV文件写入的writeCSV()方法。

学生实践练习

3知识架构6.4异常1异常抛出2异常捕捉3常见的异常4学生实践练习6.4异常1

异常抛出

异常是一个事件,该事件会在程序执行过程中发生,会影响程序的正常执行。一般情况下,在Python无法正常处理程序时就会产生一个异常。异常是Python对象,表示一个错误。当Python脚本发生异常时,我们需要捕获处理它,否则程序会终止执行。6.4异常1

异常抛出

raise[Exception[,args[,traceback]]]

Exception:是异常的类型,是一个异常参数值。该参数是可选的,如果不提供,异常的参数是“None”

traceback:参数是可选的(在实践中很少使用),如果存在,则为异常跟踪对象。

在Python程序中,如果想按自己的方式出错,可以使用raise语句自己触发异常。系统定义的异常都在exceptions模块中。6.4异常1

异常抛出

【示例6.15】列出系统自定义的异常,输入一个数字,如果数字不等于5,将会触发一个异常。print("------程序执行起始位置-----")num=int(input("请输入一个数字:"))ifnum!=5:raiseException(u"Invalidnumber",num)print("------程序执行结束位置-----")6.4异常1

异常抛出

如果输入5,运行结果如图如果输入4,运行结果如图6.4异常2

异常捕捉

在Python程序中,使用try/except语句来捕捉异常,避免在异常发生时结束程序。try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。try:<语句>#运行别的代码except<异常名字>:<语句>#在引发了对应except中的异常时执行except<名字>as<附加数据>:<语句>#在引发了对应except中的异常时执行,并获得附加的数据else:<语句>#没有异常发生时执行6.4异常2

异常捕捉

使用try/except语句包括以下三种情况:(1)如果在try块中代码执行发生异常,Python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,在处理异常时没有引发新的异常,程序就会通过整个try语句。(2)如果在try块中代码执行发生异常,却没有匹配的except子句,异常将被递交到上层的try语句中,或者结束程序,并打印默认的出错信息。(3)如果在try子句执行时没有发生异常,程序正常执行,如果有else语句,Python将执行else语句后的语句。6.4异常2

异常捕捉

【示例6.16】分别演示try/except语句执行的三种情况。print("第一种情况,testnoexist.txt文件不存在,产生IOError异常")try:fh=open("G:\\testnoexist.txt","w")fh.write("第一种情况的测试文件,用于测试异常!")print("出现异常不再执行的代码")exceptIOError:print("Error:第一种情况没有找到文件")else:print("第一种情况内容写入文件成功")fh.close()print("第二种情况,test.txt文件存在,没有异常产生")try:fh=open("test.txt","w")fh.write("第二种情况这是一个测试文件,用于测试异常!")exceptIOError:print("Error:第二种情况没有找到文件")else:6.4异常2

异常捕捉

print("第二种情况内容写入文件成功")fh.close()print("第三种情况:test.txt文件存在,但产生的不是ArithmeticError异常")try:fh=open("test.txt","r")fh.write("第三种情况这是一个测试文件,用于测试异常!")exceptArithmeticError:print("Error:数值计算错误异常")else:print("第三种情况内容写入文件成功")fh.close()print("程序执行结束")【示例6.16】分别演示try/except语句执行的三种情况。6.4异常2

异常捕捉

分别演示try/except语句执行的三种情况,运行结果如图6.26所示。6.4异常2

异常捕捉

try:执行代码except:发生异常后执行的代码else:如果没有异常执行的代码

可以不带任何异常类型直接使用except,这种方式将捕获所有发生的异常。但这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息,其语法如下:6.4异常2

异常捕捉

try:<语句>finally:<语句>#退出try时总会执行

为保证一定能够回收try语句块中打开的物理资源,Python异常处理机制提供了try_x0002_finally语句,其作用和Java语言的finally语句一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论