版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章
文件读写与操作《数据采集与处理:基于Python》2024/5/1112024/5/112教学目标本章学习目标1.了解文件的基本概念、分类、常见文件格式和基本特点,理解不同类型文件的功能和适用范围;2.掌握Python基本的文件操作,了解对象序列化和反序列化操作及作用;3.掌握常见结构化数据文件(如CSV、JSON、Excel和XML)的Python基本读写操作方法,理解文件的内容结构和编码格式;4.了解常见非结构化数据文件(如Word、PDF、图像等)的内容组织格式和读写方法,理解用于科学数据存储的HDF文件的格式、结构特点及读写方法。本章提纲1、文件读写基本操作2、CSV文件读写3、JSON文件读写4、XML文件读写5、HDF文件读写6、PDF文件读写7、图像文件读写文件读写基本操作2024/5/113文件的概念及分类4为了长期保存数据以便重复使用、修改和共享,必须将数据以文件的形式存储到外部存储介质(如磁盘、U盘、光盘或云盘、网盘、快盘等)中。文件操作在各类应用软件的开发中均占有重要的地位:管理信息系统是使用数据库来存储数据的,而数据库最终还是要以文件的形式存储到硬盘或其他存储介质上。应用程序的配置信息往往也是使用文件来存储的,图形、图像、音频、视频、可执行文件等等也都是以文件的形式存储在磁盘上的。文件的概念及分类5按文件中数据的组织形式把文件分为文本文件和二进制文件两类。文本文件:文本文件存储的是常规字符串,由若干文本行组成,通常每行以换行符'\n'结尾。常规字符串是指记事本或其他文本编辑器能正常显示、编辑并且人类能够直接阅读和理解的字符串,如英文字母、汉字、数字字符串。文本文件可以使用字处理软件如gedit、记事本进行编辑。二进制文件:二进制文件把对象内容以字节串(bytes)进行存储,无法用记事本或其他普通字处理软件直接进行编辑,通常也无法被人类直接阅读和理解,需要使用专门的软件进行解码后读取、显示、修改或执行。常见的如图形图像文件、音视频文件、可执行文件、资源文件、各种数据库文件、各类office文档等都属于二进制文件。文件基本操作无论是文本文件还是二进制文件,其操作流程基本都是一致的,首先打开文件并创建文件对象,然后通过该文件对象对文件内容进行读取、写入、删除、修改等操作,最后关闭并保存文件内容。6内置函数open()7open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)file参数指定了被打开的文件名称。mode参数指定了打开文件后的处理方式。buffering参数指定了读写文件的缓存模式。0表示不缓存,1表示缓存,如大于1则表示缓冲区的大小。默认值是缓存模式。encoding参数指定对文本进行编码和解码的方式,只适用于文本模式,可以使用Python支持的任何格式,如GBK、gb18030、gb2312、utf8、CP936等等。注意:对于中文内容的文件,打开读取内容如果是乱码,可尝试设置encoding为对应中文编码格式内置函数open()文件打开模式8模式说明r读模式(默认模式,可省略),如果文件不存在则抛出异常w写模式,如果文件已存在,先清空原有内容x写模式,创建新文件,如果文件已存在则抛出异常a追加模式,不覆盖文件中原有内容b二进制模式(可与其他模式组合使用)t文本模式(默认模式,可省略)+读、写模式(可与其他模式组合使用)图示图示内置函数open()11如果执行正常,open()函数返回1个文件对象,通过该文件对象可以对文件进行读写操作。如果指定文件不存在、访问权限不够、磁盘空间不足或其他原因导致创建文件对象失败则抛出异常。f1=open('file1.txt','r')#以读模式打开文件f2=open('file2.txt','w')#以写模式打开文件当对文件内容操作完以后,一定要关闭文件对象,这样才能保证所做的任何修改都确实被保存到文件中。f1.close()文件对象属性与常用方法12方法功能说明close()把缓冲区的内容写入文件,同时关闭文件,并释放文件对象flush()把缓冲区的内容写入文件,但不关闭文件read([size])从文本文件中读取size个字符(Python3.x)的内容作为结果返回,或从二进制文件中读取指定数量的字节并返回,如果省略size则表示读取所有内容readline()从文本文件中读取一行内容作为结果返回readlines()把文本文件中的每行文本作为一个字符串存入列表中,返回该列表seek(offset[,whence])把文件指针移动到新的字节位置,offset表示相对于whence的位置。whence为0表示从文件头开始计算,1表示从当前位置开始计算,2表示从文件尾开始计算,默认为0tell() 返回文件指针的当前位置write(s)把s的内容写入文件writelines(s)把字符串列表写入文本文件,不添加换行符上下文管理语句with在实际开发中,读写文件应优先考虑使用上下文管理语句with,关键字with可以自动管理资源,不论因为什么原因(哪怕是代码引发了异常)跳出with块,总能保证文件被正确关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的上下文,常用于文件操作、数据库连接、网络连接、多线程与多进程同步时的锁对象管理等场合。withopen(filename,mode,encoding)asfp:#这里写通过文件对象fp读写文件内容的语句13文本文件内容操作案例精选14例1-1
向文本文件中写入内容,然后再读出。s='Helloworld\n文本文件的读取方法\n文本文件的写入方法\n'withopen('sample.txt','w')asfp:#默认使用cp936编码fp.write(s)withopen('sample.txt')asfp:#默认使用cp936编码print(fp.read())文本文件内容操作案例精选例1-2
遍历并输出文本文件的所有行内容。withopen('sample.txt')asfp:#假设文件采用CP936编码forlineinfp:#文件对象可以直接迭代print(line)15文本文件内容操作案例精选例1-3
假设文件data.txt中有若干整数,每行一个整数,编写程序读取所有整数,将其按降序排序后再写入文本文件data_asc.txt中。withopen('data.txt','r')asfp:data=fp.readlines()#读取所有行,存入列表data=[int(item)foritemindata]#列表推导式,转换为数字data.sort(reverse=True)#降序排序data=[str(item)+'\n'foritemindata]#将结果转换为字符串#data.sort(key=int,reverse=True)#直接这样更简洁withopen('data_desc.txt','w')asfp:#将结果写入文件fp.writelines(data)16二进制文件与对象序列化数据库文件、图像文件、可执行文件、动态链接库文件、音频文件、视频文件、Office文档等均属于二进制文件。对于二进制文件,不能使用记事本或其他文本编辑软件直接进行正常读写,也不能通过Python的文件对象直接读取和理解二进制文件的内容。必须正确理解二进制文件结构和序列化规则,然后设计正确的反序列化规则,才能准确地理解二进制文件内容。所谓序列化,简单地说就是把内存中的数据在不丢失其类型信息的情况下转成二进制形式的过程,对象序列化后的数据经过正确的反序列化过程应该能够准确无误地恢复为原来的对象。Python中常用的序列化模块有struct、pickle、shelve、marshal。17pickle模块读写二进制文件例:
使用pickle模块写入二进制文件。importpicklei=13000000a=99.056s='中国人民123abc'lst=[[1,2,3],[4,5,6],[7,8,9]]tu=(-5,10,8)coll={4,5,6}dic={'a':'apple','b':'banana','g':'grape','o':'orange'}data=(i,a,s,lst,tu,coll,dic)withopen('sample_pickle.dat','wb')asf:try:pickle.dump(len(data),f)#要序列化的对象个数foritemindata:pickle.dump(item,f)#序列化数据并写入文件except:print('写文件异常')18pickle模块读写二进制文件例:使用pickle模块读取上例中二进制文件的内容。importpicklewithopen('sample_pickle.dat','rb')asf:n=pickle.load(f)#读出文件中的数据个数foriinrange(n): x=pickle.load(f)#读取并反序列化每个数据print(x)19struct模块读写二进制文件例:
使用struct模块写入二进制文件。importstructn=1300000000x=96.45b=Trues='a1@中国'sn=struct.pack('if?',n,x,b)#序列化,i表示整数,f表示实数,?表示逻辑值withopen('sample_struct.dat','wb')asf:f.write(sn)f.write(s.encode())#字符串需要编码为字节串再写入文件20struct模块读写二进制文件例:
使用struct模块读取上例中二进制文件的内容。importstructwithopen('sample_struct.dat','rb')asf:sn=f.read(9)n,x,b1=struct.unpack('if?',sn)#使用指定格式反序列化print('n=',n,'x=',x,'b1=',b1)s=f.read(9).decode()print('s=',s)21shelve模块操作二进制文件22例:
使用shelve模块读写二进制文件。>>>importshelve>>>zhangsan={'age':38,'sex':'Male','address':'SDIBT'}>>>lisi={'age':40,'sex':'Male','qq':'1234567','tel':'7654321'}>>>withshelve.open('shelve_test.dat')asfp:
fp['zhangsan']=zhangsan#像操作字典一样把数据写入文件
fp['lisi']=lisi
foriinrange(5):
fp[str(i)]=str(i)shelve模块操作二进制文件23>>>withshelve.open('shelve_test.dat')asfp:
print(fp['zhangsan'])#读取并显示文件内容
print(fp['zhangsan']['age'])
print(fp['lisi']['qq'])
print(fp['3']){'sex':'Male','address':'SDIBT','age':38}3812345673marshal模块操作二进制文件例:
使用marshal模块读写二进制文件,并对对象进行序列化和反序列化操作。>>>importmarshal#导入模块>>>x1=30#待序列化的对象>>>x2=5.0>>>x3=[1,2,3]>>>x4=(4,5,6)>>>x5={'a':1,'b':2,'c':3}>>>x6={7,8,9}>>>x=[eval('x'+str(i))foriinrange(1,7)]#把所有数据放入列表>>>x[30,5.0,[1,2,3],(4,5,6),{'a':1,'b':2,'c':3},{8,9,7}]>>>withopen('test.dat','wb')asfp:#创建二进制文件 marshal.dump(len(x),fp)#先写入对象个数 foriteminx: marshal.dump(item,fp)#把列表中的对象依次序列化并写入文件24marshal模块操作二进制文件>>>withopen('test.dat','rb')asfp:#打开二进制文件 n=marshal.load(fp)#获取对象个数 foriinrange(n): print(marshal.load(fp))#反序列化,输出结果305.0[1,2,3](4,5,6){'a':1,'b':2,'c':3}{8,9,7}25文件与文件夹操作26文件在计算机中一般存放到指定的文件夹中,即以目录方式进行管理。对文件和文件夹的操作,一般包括删除、移动、拷贝、粘贴、改名、检索等。Python提供了多个文件和文件夹操作的模块,如os、shutil等。os模块27方法功能说明chdir(path)把path设为当前工作目录curdir当前文件夹environ包含系统环境变量和值的字典extsep当前操作系统所使用的文件扩展名分隔符get_exec_path()返回可执行文件的搜索路径getcwd()返回当前工作目录listdir(path)返回path目录下的文件和目录列表os模块28方法功能说明remove(path)删除指定的文件,要求用户拥有删除文件的权限,并且文件没有只读或其他特殊属性rename(src,dst)重命名文件或目录,可以实现文件的移动,若目标文件已存在则抛出异常,不能跨越磁盘或分区replace(old,new)重命名文件或目录,若目标文件已存在则直接覆盖,不能跨越磁盘或分区scandir(path='.')返回包含指定文件夹中所有DirEntry对象的迭代对象,遍历文件夹时比listdir()更加高效sep当前操作系统所使用的路径分隔符startfile(filepath[,operation])使用关联的应用程序打开指定文件或启动指定应用程序system()启动外部程序os模块>>>importos>>>importos.path>>>os.rename('C:\\dfg.txt','D:\\test2.txt')#rename()可以实现文件的改名和移动>>>[fnameforfnameinos.listdir('.')iffname.endswith(('.pyc','.py','.pyw'))]#结果略>>>os.getcwd()#返回当前工作目录'C:\\Python35'>>>os.mkdir(os.getcwd()+'\\temp')#创建目录>>>os.chdir(os.getcwd()+'\\temp')#改变当前工作目录>>>os.getcwd()'C:\\Python35\\temp'>>>os.mkdir(os.getcwd()+'\\test')>>>os.listdir('.')['test']>>>os.rmdir('test')#删除目录>>>os.listdir('.')[]29os模块>>>os.environ.get('path')#获取系统变量path的值>>>importtime>>>time.strftime('%Y-%m-%d%H:%M:%S',#查看文件创建时间time.localtime(os.stat('Auto.csv').st_ctime))'2016-10-1815:58:57'>>>os.startfile('notepad.exe')#启动记事本程序30os模块例:
使用递归法遍历指定目录下所有子目录和文件。fromosimportlistdirfromos.pathimportjoin,isfile,isdirdeflistDirDepthFirst(directory):'''深度优先遍历文件夹'''#遍历文件夹,如果是文件就直接输出#如果是文件夹,就输出显示,然后递归遍历该文件夹forsubPathinlistdir(directory):path=join(directory,subPath)ifisfile(path):print(path)elifisdir(path):print(path)listDirDepthFirst(path)31os.path模块32方法功能说明abspath(path)返回给定路径的绝对路径basename(path)返回指定路径的最后一个组成部分commonpath(paths)返回给定的多个路径的最长公共路径commonprefix(paths)返回给定的多个路径的最长公共前缀dirname(p)返回给定路径的文件夹部分exists(path)判断文件是否存在getatime(filename)返回文件的最后访问时间getctime(filename)返回文件的创建时间getmtime(filename)返回文件的最后修改时间getsize(filename)返回文件的大小os.path模块33方法功能说明isabs(path)判断path是否为绝对路径isdir(path)判断path是否为文件夹isfile(path)判断path是否为文件join(path,*paths)连接两个或多个pathrealpath(path)返回给定路径的绝对路径relpath(path)返回给定路径的相对路径,不能跨越磁盘驱动器或分区samefile(f1,f2)测试f1和f2这两个路径是否引用的同一个文件split(path)以路径中的最后一个斜线为分隔符把路径分隔成两部分,以元组形式返回splitext(path)从路径中分隔文件的扩展名splitdrive(path)从路径中分隔驱动器的名称os.path模块>>>path='D:\\mypython_exp\\new_test.txt'>>>os.path.dirname(path)#返回路径的文件夹名'D:\\mypython_exp'>>>os.path.basename(path)#返回路径的最后一个组成部分'new_test.txt'>>>os.path.split(path)#切分文件路径和文件名('D:\\mypython_exp','new_test.txt')>>>os.path.split('')#切分结果为空字符串('','')>>>os.path.split('C:\\windows')#以最后一个斜线为分隔符('C:\\','windows')>>>os.path.split('C:\\windows\\')('C:\\windows','')>>>os.path.splitdrive(path)#切分驱动器符号('D:','\\mypython_exp\\new_test.txt')>>>os.path.splitext(path)#切分文件扩展名('D:\\mypython_exp\\new_test','.txt')34shutil模块35方法功能说明copy(src,dst)复制文件,新文件具有同样的文件属性,如果目标文件已存在则抛出异常copy2(src,dst)复制文件,新文件具有原文件完全一样的属性,包括创建时间、修改时间和最后访问时间等等,如果目标文件已存在则抛出异常copyfile(src,dst)复制文件,不复制文件属性,如果目标文件已存在则直接覆盖copyfileobj(fsrc,fdst)在两个文件对象之间复制数据,例如copyfileobj(open('123.txt'),open('456.txt','a'))copymode(src,dst)把src的模式位(modebit)复制到dst上,之后二者具有相同的模式copystat(src,dst)把src的模式位、访问时间等所有状态都复制到dst上copytree(src,dst)递归复制文件夹disk_usage(path)查看磁盘使用情况move(src,dst)移动文件或递归移动文件夹,也可以给文件和文件夹重命名rmtree(path)递归删除文件夹make_archive(base_name,format,root_dir=None,base_dir=None)创建tar或zip格式的压缩文件unpack_archive(filename,extract_dir=None,format=None)解压缩压缩文件shutil模块下面的代码演示了如何使用标准库shutil的copyfile()方法复制文件。>>>importshutil#导入shutil模块>>>shutil.copyfile('C:\\dir.txt','C:\\dir1.txt')#复制文件下面的代码将C:\Python35\Dlls文件夹以及该文件夹中所有文件压缩至D:\a.zip文件:>>>shutil.make_archive('D:\\a','zip','C:\\Python35','Dlls')'D:\\a.zip'下面的代码将刚压缩得到的文件D:\a.zip解压缩至D:\a_unpack文件夹:>>>shutil.unpack_archive('D:\\a.zip','D:\\a_unpack')下面的代码使用shutil模块的方法删除刚刚解压缩得到的文件夹:>>>shutil.rmtree('D:\\a_unpack')36shutil模块下面的代码使用shutil的copytree()函数递归复制文件夹,并忽略扩展名为pyc的文件和以“新”字开头的文件和子文件夹:>>>fromshutilimportcopytree,ignore_patterns>>>copytree('C:\\python35\\test','D:\\des_test',ignore=ignore_patterns('*.pyc','新*'))37综合案例解析例:
把指定文件夹中的所有文件名批量随机化,保持文件类型不变。fromstringimportascii_lettersfromosimportlistdir,renamefromos.pathimportsplitext,joinfromrandomimportchoice,randintdefrandomFilename(directory):forfninlistdir(directory):#切分,得到文件名和扩展名name,ext=splitext(fn)n=randint(5,20)#生成随机字符串作为新文件名newName=''.join((choice(ascii_letters)foriinrange(n)))#修改文件名rename(join(directory,fn),join(directory,newName+ext))randomFilename('C:\\test')38CSV文件操作2024/5/1139最简单的(也是结构最少的)是CSV-逗号分隔值(Comma-SeparatedValues文件,有时也称为字符分隔值,因为分隔字符也可以不是逗号,可以是制表符、分号、冒号等。CSV不是一种正式的文件格式,而是一个以文本文件表示的表,其中单元格由分隔符分隔。通常,第一行表示标题。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。“CSV”并不是一种单一的、定义明确的格式(尽管RFC4180有一个被通常使用的定义)。因此在实践中,术语“CSV”泛指具有以下特征的任何文件:纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312;由记录组成(典型的是每行一条记录);每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格);每条记录都有同样的字段序列。CSV文件简介CSV规则:开头是不留空,以行为单位。可含或不含列名,含列名则居文件第一行。一行数据不跨行,无空行。以半角逗号(即,)作分隔符,列为空也要表达其存在。列内容如存在半角引号(即"),替换成半角双引号("")转义,即用半角引号(即"")将该字段值包含起来。文件读写时引号,逗号操作规则互逆。内码格式不限,可为ASCII、Unicode或者其他。不支持数字不支持特殊字符CSV文件简介CSV格式例子,如本书配套练习文件hit_albums.csv:Artist,Album,GenreMichaelJackson,Bad,Pop,funk,rock在这里,Album是由逗号分隔的多种Genre。但是,逗号也用于分隔各个列。为了解决这个问题,通常使用双引号来表示引号中包含的所有元素都不是定界符:Artist,Album,GenreMichaelJackson,Bad,"Pop,funk,rock"现在,可以清楚Pop,funk,rock应该属于一个单元CSV文件简介读取CSV文件有多种方法。可以使用Python的基本文件读(和写)操作,也可以使用CSV模块读写,还可以使用Pandas模块对CSV文件内容更便捷地读写操作。Pandas模块提供了多种数据源的操作方法,如CSV、JSON、HDF、Excel、HTML甚至关系数据库等。2.2CSV文件读写Python3中的默认的编码解码方式为utf-8Windows系统默认使用的编码方式为gbk当读取一个Windows文件(gbk),可以指定读取时使用的编码encoding=('gbk')或者不需要指定。当Python写入文件时,默认使用的utf-8编码,在Windows上打开会乱码,因为Windows默认编码是gbk#Python内置open函数打开文件albums_file=open('hit_albums.csv','r',encoding=('utf-8'))#通过文件对象的read函数一次性读取所有文件内容content=albums_file.read()#注意:行以特殊字符、换行符或换行符结束\n.如果打印出来,\n会被翻译为新行print(content)#在读取文件之后,我们必须再次手动关闭它以释放操作系统资源:albums_file.close()2.2.1基本文件操作方法或者,我们可以分别读取每一行:albums_file=open('hit_albums.csv','r',encoding='utf-8')line1=albums_file.readline();print(line1)#输出:Artist,Album,Released,Genre,"Certifiedsales(millions)",Claimedsales(millions)#字符串的split函数,可以指定分隔符拆分字符串line1.split(",")2.2.1基本文件操作方法可以循环读取文件内容到数组中:2.2.1基本文件操作方法data=[]forlineinalbums_file:data.append(line.split(","))
#let'snotforgettoclosethefile:albums_file.close()print(data)#读取单个行与单元data[0][1]print(data[0])我们可以使用"w"标识打开文件写入操作.这里我们也使用with关键字,即使出现问题,它也会为我们关闭文件:withopen('my_file.txt','w')asnew_file:new_file.write("HelloWorld\nAreyoustillspinning?\n")a=""2.2.1基本文件操作方法我们可以使用CSV库来帮助读取数据。它接受一个“delimiter”和一个“quotechar”参数,后者对我们的双引号非常有用:2.2.2CSV模块读写CSV文件importcsv#导入csv库
data_values=[]#初始化顶级数组
#打开文件并把行数据作为数组追加到data_values中.如果出现乱码,需要在open函数中设置encoding参数withopen('hit_albums.csv',encoding="utf-8")ascsvfile:#请注意,通常我们可以互换使用'和"#对于quotechar,我们使用'以便我们可以使用"而不用转义filereader=csv.reader(csvfile,delimiter=',',quotechar='"')forrowinfilereader:#这里的行是个数组
print("Row:"+str(row))data_values.append(row)
#保存头数据(header,对应列名)到单独的数组中header=data_values.pop(0)print("Headeris:",header)print("data_valuesis:",data_values)使用CSV库写入CSV文件:CSV模块读写CSV文件importcsvwithopen('test.csv','w')asf:writer=csv.writer(f)#写入表头,表头是单行数据writer.writerow(['name','age','sex'])data=[('huangyuan',20,'male'),('zhanglan',22,'female')]#写入这些多行数据writer.writerows(data)相比CSV库,Pandas库的read_csv或read_table方法读取CSV文件更方便快捷。Pandas模块读写CSV文件#Pandas的read_csv函数。Pandas从数据源读取数据的函数,基本都是以read_开头importpandasaspdhit_albums=pd.read_csv("hit_albums.csv")hit_albums.head()#缺省查看头5行还可以使用read_table函数,读取空格或分隔符分隔的数据,效果与read_csv函数一样。Pandas模块读写CSV文件hit_albums_table=pd.read_table('hit_albums.csv',sep=',')print(type(hit_albums_table))hit_albums_table.head()反之,还可以使用to_开头的函数,将文件DataFrame数据写入文件。hit_albums.to_csv("dfout-test1.csv")#带有索引hit_albums.to_csv("dfout-test2.csv",index=None)#不带索引hit_albums.to_csv("dfout-test3.csv",index=None,header=False)#不带索引,不带列名头如果读取文件太大,需要考虑分块读取及显示部分内容。如:pd.options.display.max_rows=10,read_csv函数设置一次读取数量的参数,如nrows限定读取行数;chunksize分批次处理文件,每次处理多少数据Pandas模块读写CSV文件pd.options.display.max_rows=20hit_albums=pd.read_csv("hit_albums.csv",nrows=6)print(hit_albums)#有chunksize,返回的就是TextFileReader对象,需要循环处理每批次返回的数据hit_albums_table=pd.read_table('hit_albums.csv',chunksize=3)#chunksize参数是指每次读取块的行数#hit_albums_table=pd.read_table('hit_albums.csv',sep=',',chunksize=3)print(type(hit_albums_table))#print("遍历前转换列表:",list(enumerate(hit_albums_table)))#hit_albums_table是个迭代器类型,遍历一次则为空#print("再次遍历内容:")forindex,datainenumerate(hit_albums_table):ifindex<5:print(data)XML文件读写2024/5/1153XML简介1.XML概述XML(ExtensibleMarkupLanguage,简称XML),即可扩展标记语言,是互联网数据传输的重要工具,可以跨越互联网任何平台,不受编程语言和操作系统限制,是互联网异构应用数据共享的主要标准规范。XML表示数据结构化良好,自解释能力强,有助于在服务器之间共享传输结构化数据,便于开发人员控制数据的存储和传输。XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML是标准通用标记语言(SGML)的子集,非常适合Web传输。XML提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。54XML简介2.XML特点与作用扩展性:允许使用者自定义的标记来描述数据。自描述性:容易阅读,可以使用XML语言来定义特定的文档模式,以检验XML文档是否满足特定要求。跨平台:独立于操作系统、开发语言和不同应用,方便网络传输和异构系统之间共享数据。语法简洁:用SGML的20%的复杂性,保留了80%的功能。方便定义新的规范:使用XML可以创造符合某一特定领域的数据描述标签,以满足特定领域数据描述的需要。例如Spring开源框架的配置文件、ebXML(电子商务领域XML)、WebServices中的系列规范等。基于XML上述特点和优点,XML常用于配置应用程序和网站、网页数据表示、异构程序数据交互与Ajax基石,还经常用来定义新的语言规范和数据共享规范等。55XML简介3.XML的声明XML声明一般是XML文档的第一行,如简单的XML文档声明:<?xmlversion="1.0"?>。XML区别大小写,其声明一般包括由以下几个部分:version属性:说明当前XML文档的版本,一般写为1.0,version属性是必须的;encoding属性:说明当前XML文档使用的字符编码集,XML解析器会使用这个编码来解析XML文档。encoding属性是可选的,默认为UTF-8。注意,如果XML文档使用的字符编码集和encoding属性值不同,则会导致乱码或解析错误。standalone属性:说明当前XML文档是否为独立文档,默认值为yes。如果该属性值为yes,表示当前XML文档是独立的,如果为no表示当前XML文档不是独立的,即依赖外部的约束文件。56XML简介4.根元素它是XML文档里面唯一的;它的开始是放在最前面,结束是放在最后面。5.元素(1)所有的XML元素都必须有结束标签;(2)XML标签对大小写敏感;(3)XML必须正确地嵌套;(4)元素的命名规则:名称中可以包含字母、数字或者其他的字符;名称不能以数字或者标点符号开始;名称中不能包含空格。(5)空元素6.属性(1)语法<元素名属性名=“属性值”/>。例如:<Name>Tom</Name>(2)注意属性值用双引号包裹;一个元素可以有多个属性,它的基本格式为:<元素名属性名=“属性值”属性名=“属性值”>;属性值中不能够直接包含<.”,&。57XML简介7.实体语法形式为:<!ENTITY实体名称"实体的值">。XML中5个预定义实体。。8.注释注释的内容会被程序忽略而不做解释和处理。注释方法为:<!--注释内容-->。注意:注释内容中不要出现”--”;不能把注释放在标签中间;注释不能嵌套。9.命名空间在XML中,元素名称可能是由不同开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。XML命名空间则提供了避免元素命名冲突的方法,通过使用名称前缀从而容易地避免。当在XML中使用前缀时,用于前缀的命名空间必须被定义。命名空间是在元素的开始标签的xmlns属性中定义的。命名空间声明的语法如下。xmlns:前缀="URI"。当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。58XML简介定义XML数据时,需要注意保持格式良好及有效性,而有效的(valid)XML文档,首先是个格式良好规范的XML文档,然后又需要满足DTD(DataTypeDefinition的缩写)的要求。遵循如下规则的XML文档称为格式良好的XML文档:必须有XML声明语句;必须有且仅有一个根元素;标签大小写敏感;属性值用双引号;标签成对;空标签关闭;元素正确嵌套。59XML读写1.lxml模块安装Python工具需要安装lxml模块,安装方法:condainstalllxmlpipinstallbeautifulsoup4html5lib或者:pipinstallbs42.读写示例60fromlxmlimportobjectify
path='Performance_MNR.xml'parsed=objectify.parse(open(path))print(parsed)root=parsed.getroot()#返回的是文档对象模型DOM数据结构data=[]skip_fields=['PARENT_SEQ','INDICATOR_SEQ','DESIRED_CHANGE','DECIMAL_PLACES']foreltinroot.INDICATOR:el_data={}#以字典形式存储每行记录数据forchildinelt.getchildren():ifchild.taginskip_fields:continueel_data[child.tag]=child.pyvaldata.append(el_data)#多行记录以列表形式存储perf=pd.DataFrame(data)perf.head()JSON文件操作2024/5/1161JSON简介1.JSON简介JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,C++,C#,Java,JavaScript,Perl,Python等)。这些特性使JSON成为理想的数据交换语言。JSON是DouglasCrockford在2001年开始推广使用的数据格式,在2005年-2006年正式成为主流的数据格式,雅虎和谷歌就在那时候开始广泛地使用JSON格式。JSON语法规则在JS语言中,一切都是对象。因此,任何支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:对象表示为键值对数据由逗号分隔花括号保存对象方括号保存数组JSON简介JSON建构于两种结构:(1)“名称/值”对的集合(Acollectionofname/valuepairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hashtable),有键列表(keyedlist),或者关联数组(associativearray)。(2)值的有序列表(Anorderedlistofvalues)。在大部分语言中,它被理解为数组(array)。JSON与JS对象的关系JSON是JS对象的字符串表示法,它使用文本表示一个JS对象的信息,本质是一个字符串。如varobj={a:'Hello',b:'World'};//这是一个对象,注意键名也是可以使用引号包裹的varjson='{"a":"Hello","b":"World"}';//这是一个JSON字符串,本质是一个字符串2.基础示例简单地说,JSON可以将JavaScript对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从Web客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是JavaScript很容易解释它,而且JSON可以表示比"名称/值"对更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。3.1JSON简介表示名称/值对按照最简单的形式,可以用下面这样的JSON表示"名称/值"对:{"firstName":"Brett"}。这个示例非常基本,而且实际上比等效的纯文本"名称/值"对占用更多的空间:firstName=Brett但是,当将多个"名称/值对"串在一起时,JSON就会体现出它的价值了。首先,可以创建包含多个"名称/值"对的记录,比如:{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}从语法方面来看,这与"名称/值"对相比并没有很大的优势,但是在这种情况下JSON更容易使用,而且可读性更好。例如,它明确地表示以上三个值都是同一记录的一部分;花括号使这些值有了某种联系。表示数组当需要表示一组值时,JSON不但能够提高可读性,而且可以减少复杂性。例如,假设您希望表示一个人名列表。在XML中,需要许多开始标记和结束标记;如果使用典型的名称/值对(就像在本系列前面文章中看到的那种名称/值对),那么必须建立一种专有的数据格式,或者将键名称修改为person1-firstName这样的形式。JSON简介如果使用JSON,就只需将多个带花括号的记录分组在一起:JSON简介{"people":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}]}JSON简介{"programmers":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}],"authors":[{"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"},{"firstName":"Tad","lastName":"Williams","genre":"fantasy"},{"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"}],"musicians":[{"firstName":"Eric","lastName":"Clapton","instrument":"guitar"},{"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"}]}3.1JSON简介3.与XML比较1)可读性JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。2)可扩展性XML天生有很好的扩展性,JSON当然也有,没有什么是XML可以扩展而JSON却不能扩展的。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。3)编码难度XML有丰富的编码工具,比如Dom4j、Dom、SAX等,JSON也有提供的工具。无工具的情况下,相信熟练的开发人员一样能很快的写出想要的xml文档和JSON字符串,不过,xml文档要多很多结构上的字符。4)解码难度XML的解析方式有两种:一是通过文档模型解析,也就是通过父标签索引出一组标记。例如:xmlData.getElementsByTagName(“tagName”),但是需要预先知道文档结构的情况下使用。二是遍历节点(document以及childNodes),可以通过递归来实现,不过解析出来的数据仍旧是形式各异。凡是这样可扩展的结构数据解析起来一定都很困难。JSON也同样如此。<?xmlversion="1.0"encoding="utf-8"?><country><name>中国</name><province><name>黑龙江</name><cities><city>哈尔滨</city><city>大庆</city></cities></province><province><name>广东</name><cities><city>广州</city><city>深圳</city><city>珠海</city></cities></province><province><name>台湾</name><cities><city>台北</city><city>高雄</city></cities></province><province><name>新疆</name><cities><city>乌鲁木齐</city></cities></province></country>{"name":"中国","province":[{"name":"黑龙江","cities":{"city":["哈尔滨","大庆"]}},{"name":"广东","cities":{"city":["广州","深圳","珠海"]}},{"name":"台湾","cities":{"city":["台北","高雄"]}},{"name":"新疆","cities":{"city":["乌鲁木齐"]}}]}XML与JSON格式比较:左边为XML,右边为JSONJSON简介JSON读写1.使用json模块操作json数据#对于较长的字符串,需要使用""""""obj="""{"name":"Wes","places_lived":["UnitedStates","Spain","Germany"],"pet":null,"siblings":[{"name":"Scott","age":30,"pets":["Zeus","Zuko"]},{"name":"Katie","age":38,"pets":["Sixes","Stache","Cisco"]}]}"""importjsonresult=json.loads(obj)result#结果为字典结构#将json对象序列化asjson=json.dumps(result)print(asjson)JSON读写2.使用Pandas模块操作JSON数据read_json函数语法:pandas.read_json(path_or_buf=None,orient=None,typ='frame',dtype=True,convert_axes=True,convert_dates=True,keep_default_dates=True,numpy=False,precise_float=False,date_unit=None,encoding=None,lines=False,chunksize=None,compression='infer')第一参数就是json文件路径或者json格式的字符串。第二参数orient是表明预期的json字符串格式。orient的设置有以下几个值:像字典的'split',像列表的'records','index','columns','values'等。importpandasaspddata=pd.read_json("Sample.json")print(data)#将DataFrame数据输出为json格式print(data.to_json())#索引形式print("记录形式:",data.to_json(orient='records'))#记录形式HDF文件操作2024/5/11725.1
HDF简介1.什么是HDFHDF(即HierarchicalDataFormat的缩写,可译为层次化数据结构)是包含多种信息的一个单文件,所有的信息放在同一个文件中。在HDF通过特定文件结构来存储多种不同信息。HDF是用于存储和分发科学数据的一种自我描述、多对象文件格式。HDF是由美国国家超级计算应用中心(NCSA)创建的,以满足不同群体的科学家在不同工程项目领域之需要。HDF可以表示出科学数据存储和分布的许多必要条件。HDF被设计为:自述性:对于一个HDF文件里的每一个数据对象,有关于该数据的综合信息(元数据)。在没有任何外部信息的情况下,HDF允许应用程序解释HDF文件的结构和内容。通用性:许多数据类型都可以被嵌入在一个HDF文件里。例如,通过使用合适的HDF数据结构,符号、数字和图形数据可以同时存储在一个HDF文件里。灵活性:HDF允许用户把相关的数据对象组合在一起,放到一个分层结构中,向数据对象添加描述和标签。它还允许用户把科学数据放到多个HDF文件里。扩展性:HDF极易容纳将来新增加的数据模式,容易与其他标准格式兼容。跨平台性:HDF是一个与平台无关的文件格式。HDF文件无需任何转换就可以在不同平台上使用。735.1
HDF简介2.HDF基本数据类型HDF提供6种基本数据类型:光栅图像(RasterImage),调色板(Palette),科学数据集(ScientificDataSet),注解(Annotation),虚拟数据(Vdata)和虚拟组(Vgrou•p)。3.HDF文件格式最好的办法是把HDF文件看成为一本多章节书。HDF文件是“数据书”,其中每章都包含一个不同类型的数据内容。正如书籍用一个目录表列出它的章节一样,HDF文件用“dataindex”(数据索引)列出其数据内容HDF文件结构包括一个fileid(文件号)、至少一个datadescriptor(数据描述符)、没有或多个dataelement(数据内容)数据内容。745.2
HDF读写Python中经常用于储存神经网络训练模型和相关参数,对应专用模块有h5py、pandas模块。支持查看编辑h5文件内容,可使用软件HDFView。75importpandasaspdimportnumpyasnpframe=pd.DataFrame({'a':np.random.randn(100)})#创建HDF存储对象storestore=pd.HDFStore('mydata.h5')store['obj1']=framestore['obj1_col']=frame['a']store['obj1'].head()#HDF存储对象操作与写入store.put('obj2',frame,format='table')aa=store.select('obj2',where=['index>=10andindex<=15'])store.close()#DataFrame对象的hdf格式文件的读写操作frame.to_hdf('mydata.h5','obj3',format='table')pd.read_hdf('mydata.h5','obj3',where=['index<5'])Office文件操作2024/5/11766.1
Word文件读写使用扩展库docx读写Word2007以及更高版本的文件。77
fromdocximportDocumentimportre
result={'li':[],'fig':[],'tab':[]}doc=Document(r'C:\Python可以这样学.docx')
forpindoc.paragraphs:#遍历文档所有段落t=p.text#获取每一段的文本ifre.match('例\d+-\d+',t):#例题result['li'].append(t)elifre.match('图\d+-\d+',t):#插图result['fig'].append(t)elifre.match('表\d+-\d+',t):#表格result['tab'].append(t)
forkeyinresult.keys():#输出结果print('='*30)forvalueinresult[key]:print(value)6.2
Excel文件读写可以使用扩展库openpyxl读写Excel2007以及更高版本的文件。Pandas的to_excel和read_excel函数也可以读写Excel文件,读写时候需要注意编码格式encoding、表单号sheet、表头head.下面是对应Pandas的函数形式:1.to_excel(excel_writer,sheet_name='Sheet1',na_rep='',float_format=None,columns=None,header=True,index=True,index_label=None,startrow=0,startcol=0,engine=None,merge_cells=True,encoding=None,inf_rep='inf',verbos
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年江西外语外贸职业学院单招职业技能测试题库附答案解析
- 2025下半年昭通市大关县卫健系统招聘编外人员(24人)历年真题汇编附答案解析
- 2026年上半年黑龙江省中小学教师资格考试(笔试)备考题库及答案【夺冠系列】
- 2023年辽源职业技术学院单招职业倾向性测试题库附答案解析
- 2024年温州科技职业学院单招职业适应性测试题库附答案解析
- 2023年湖北省荆门市单招职业适应性考试题库附答案解析
- 2024年福州工商学院单招职业适应性考试题库附答案解析
- 2024年北京北大方正软件职业技术学院单招职业适应性测试模拟测试卷附答案解析
- 2025年湖南软件职业技术大学单招职业倾向性测试模拟测试卷附答案解析
- 2024年江西信息应用职业技术学院单招职业技能考试题库附答案解析
- 服装设计师录用合同及制度
- 电梯限速器校验合同(2篇)
- 某200米超高层泵送混凝土专项施工方案
- 期中测试卷(试题)-2024-2025学年六年级上册数学苏教版
- GB/T 44273-2024水力发电工程运行管理规范
- DZ-T+0155-1995钻孔灌注桩施工规程
- 【当代中国外交(外交学院)】试题及答案
- 有序则安之现场定置管理技术
- V型滤池设计计算书2021
- 医院护理培训课件:《老年患者静脉输液的治疗与护理》
- LY/T 1690-2017低效林改造技术规程
评论
0/150
提交评论