Python程序设计第6章+文件操作_第1页
Python程序设计第6章+文件操作_第2页
Python程序设计第6章+文件操作_第3页
Python程序设计第6章+文件操作_第4页
Python程序设计第6章+文件操作_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

Python程序设计第1章初识Python程序目录/CONTENTS第2章程序基本构成第3章控制结构第4章函数第5章复合数据类型第6章文件操作第7章数据可视化第8章图像处理第6章文件操作了解文件的分类掌握文件的打开关闭方法掌握文本文件读写操作方法了解二进制文件的读写操作方法了解os与os.path模块在文件操作中的用法了解shutil模块提供的支持文件和文件夹操作的常用方法LearningTarget学习目标6.1文件基础知识文件是长期保存数据并允许数据的重复使用、修改和共享的重要方式。文件可以包含任何数据内容,如:图形、图像、音频、视频、数据库文件、可执行文件等。6.1文件基础知识按文件中数据的组织形式,可以把文件分为文本文件和二进制文件两大类。1.文本文件文本文件一般由单一特定编码的字符组成(如UTF-8编码),可以被看作是存储在磁盘上的长字符串,由若干文本行组成,内容容易统一展示和阅读。大部分的文本文件都可以通过文本编辑软件或文字处理软件(如记事本、gedit)直接进行创建、阅读和修改。2.二进制文件二进制文件没有统一字符编码,这是它和文本文件的最主要区别。二进制文件把信息以字节串(bytes)进行存储,文件内部数据的组织格式与文件用途有关。常见的如图形和图像文件、音频和视频文件、可执行文件、各种数据库文件等,都属于二进制文件。这些文件通常无法被直接阅读和理解。6.1.1

文件分类6.1文件基础知识6.1.2字符编码字符编码(英语:Characterencoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。通俗来讲,就是计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。6.1文件基础知识6.1.2字符编码最早的编码表被称为ASCII编码,只有127个字母被编码到计算机里。为了满足国内在计算机中使用汉字的需要,中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为GB码,或国标码。GB2312码是中华人民共和国国家汉字信息交换用编码,GBK是对GB2312-80的扩展。世界上其他语言,如日文、韩文等也有各自的编码方式。将世界上所有的符号都纳入一个编码表,这就是Unicode编码。为了提高Unicode的编码效率,于是就出现了UTF-8编码。6.1文件基础知识6.1.2字符编码Python3默认编码为Unicode,由str类型表示,二进制数据使用bytes类型表示。在实际应用中,我们经常将字符类型和字节类型相互转换。1.encode([encoding]):编码,将Unicode字符串转换成特定字符编码对应的字节串的过程。其中,encoding是python的编码方式。2.decode([encoding]):解码,将特定字符编码的字节串转换为对应的Unicode字符串的过程。其中,encoding是python的编码方式。6.1文件基础知识6.1.2字符编码>>>s="今天真高兴">>>s_gbk=s.encode('gbk')>>>s_gbkb'\xbd\xf1\xcc\xec\xd5\xe6\xb8\xdf\xd0\xcb'>>>type(s_gbk)<class'bytes'>>>>s2=b'\xbd\xf1\xcc\xec\xd5\xe6\xb8\xdf\xd0\xcb'>>>s2_gbk=s2.decode('gbk')>>>s2_gbk今天真高兴>>>type(s2_gbk)<class'str'>6.1文件基础知识6.1.2字符编码注意:unicode,utf-8,gb2312,gbk,虽然都能表示各种字符,但是各种字符在各种编码方式下的码是不一样的,用什么格式编码,通常用什么格式解码。以下代码示例:>>>name="天天好心情">>>bs=name.encode("gb2312")>>>bsb'\xcc\xec\xcc\xec\xba\xc3\xd0\xc4\xc7\xe9'>>>bs2=name.encode("utf-8")>>>bs2b'\xe5\xa4\xa9\xe5\xa4\xa9\xe5\xa5\xbd\xe5\xbf\x83\xe6\x83\x85'#同一字符串name,不同编码后结果不同>>>name_dc=bs.decode("utf-8")#不能用utf-8解码,会有异常Traceback(mostrecentcalllast):File"<pyshell#9>",line1,in<module>

name_dc=bs.decode("utf-8")UnicodeDecodeError:'utf-8'codeccan'tdecodebyte0xccinposition0:invalidcontinuationbyte>>>name_dc=bs.decode("gb2312")#用gb2312解码,没有问题>>>name_dc天天好心情6.2文件的打开和关闭6.2.1

文件的打开Python对文本文件和二进制文件采用统一的操作步骤,即”打开——操作——关闭“。Python通过解释器内置的open()函数打开一个文件,可以指定打开模式,并创建文件对象。6.2文件的打开和关闭6.2.1

文件的打开open()函数的格式:文件对象名=open(<文件名>[,打开模式])文件名指定被打开的文件名称,如果要打开的文件不在当前目录中,则需要指定相对路径或绝对路径。打开模式用于控制使用何种方式打开文件6.2文件的打开和关闭6.2.1

文件的打开open()函数提供的打开模式,如表6-1所示。

模式

说明r读模式(默认模式,可省略),如果文件不存在则抛出异常w写模式,如果文件已存在,先清空原有内容a追加模式,不覆盖文件中原有内容b二进制模式(可与其他模式组合使用)t文本模式(默认模式,可省略)+读、写模式(可与其他模式组合使用)表6-1文件的打开模式6.2文件的打开和关闭6.2.1

文件的打开例:采用只读模式,打开当前目录中的file1.txt文件:f1=open(‘file1.txt’,’r’)采用写模式,打开当前目录中的file2.txt文件:f2=open(‘file2.txt’,’w’)6.2文件的打开和关闭6.2.2

文件的关闭当文件的内容操作完以后,一定要关闭文件,以保证所做的任何修改都得到保存。该方法的使用格式如下:文件对象名.close()例如:f1.close()

f2.close()6.2文件的打开和关闭6.2.3

打开文件时使用with语句打开文件后,需要及时关闭,在使用with语句的时候,无论是否抛出错误,都能够保证with语句执行完毕后关闭已经打开的文件。with语句的用法如下:withopen(<文件名>[,打开模式])asfp:#此处为通过文件对象fp读写文件内容的语句>>>withopen('test.txt','r')asfp:

fp.read()例如:6.3

文本文件的操作文件被打开后,根据打开方式的不同可以对文件进行相应的读写操作。当文件以文本文件打开时,读写按照字符串方式;当文件以二进制文件方式打开时,读写按照字节流方式。文件对象常用方法,如表6-2所示。6.3

文本文件的操作表6-2文件对象常用方法操作方法说明close()把缓冲区的内容写入文件,同时关闭文件,并释放文件对象flush()把缓冲区的内容写入文件,但不关闭文件read([size])从文本文件中读取size个字符(Python3.x)的内容作为结果返回,或从二进制文件中读取指定数量的字节并返回,如果省略size则表示读取所有内容readable()测试当前文件是否可读readline()从文本文件中读取一行内容作为结果返回readlines()把文本文件中的每行文本作为一个字符串存入列表中,返回该列表,对于大文件会占用较多内存,不建议使用seek(offset[,whence])把文件指针移动到新的字节位置,offset表示相对于whence的位置。whence为0表示从文件头开始计算,1表示从当前位置开始计算,2表示从文件尾开始计算,默认为0seekable()测试当前文件是否支持随机访问,如果文件不支持随机访问,则调用方法seek()、tell()和truncate()时会抛出异常tell()返回文件指针的当前位置writable()测试当前文件是否可写write(s)把s的内容写入文件writelines(s)把字符串列表写入文本文件,不添加换行符6.3

文本文件的操作6.3.1文本文件的操作【例6.1】向文本文件写入内容>>>s='文本文件的读取方法\n文本文件的写入方法\n'>>>f=open('test.txt','a+')>>>f.write(s)20>>>f.close()若使用with语句,则代码为:>>>s='文本文件的读取方法\n文本文件的写入方法\n'>>>withopen('test.txt','a+')asf:

f.write(s)206.3

文本文件的操作6.3.1文本文件的操作【例6.2】读文本文件中的内容>>>fp=open('test.txt','r')>>>print(fp.read(6))#从文件中读取前6个字符,延续前面的代码文本文件的读>>>fp.seek(0)#文件指针移动到文件头0>>>print(fp.read(12))#从文件中读取前12个字符文本文件的读取方法文本>>>fp.close()6.3

文本文件的操作6.3.2采用CSV格式对数据文件的操作逗号分隔值(Comma-SeparatedValues,CSV),有时也称为字符分隔值,其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列。例如:文件test.csv中的数据是采用CSV格式存储的城市,环比,同比,定基北京,101.5,120.7,121.4上海,101.2,127.3,127.8广州,101.3,119.4,1206.3

文本文件的操作6.3.2采用CSV格式对数据文件的操作CSV格式存储的文件一般采用.csv为扩展名,可以通过Windows平台上的记事本或微软OfficeExcel工具打开,也可以在其他操作系统平台上用文本编辑工具打开。一般的表格数据处理工具(如微软OfficeExcel等)都可以将数据另存为或导出CSV格式,用于不同工具间进行数据交换。【例6.3】将列表数据写入CSV格式文件test.csvlst=['深圳','101.5','120.7','121.4']withopen('test.csv’,‘a+’)asfp:

fp.write(",".join(lst)+"\n")#将列表数据生成字符串,并在末尾加换行符6.3

文本文件的操作6.3.2采用CSV格式对数据文件的操作【例6.4】从文件test.csv中读取数据,去掉内容中的逗号,打印到屏幕。lst=[]withopen('test.csv','r')asfp:forlineinfp:line=line.replace("\n","")

lst=line.split(",")

lns=""forsinlst:

lns+="{}\t".format(s)print(lns)运行后的输出结果如下:城市 环比 同比 定基 北京 101.5 120.7 121.4 上海 101.2 127.3 127.8 广州 101.3 119.4 120 深圳 101.5 120.7 121.4 6.4

二进制文件的操作图形图像文件、音视频文件、Office文档、可执行文件等均属于二进制文件。二进制文件可以使用文件对象的常用方法。withopen('sample.dat','rb')asf:data=f.readlines()withopen('sample_new.dat','wb')asf:

f.writelines(data)但,对于二进制文件,需要通过序列化和反序列化来处理。所谓序列化,简单地说就是把内存中的数据在不丢失其类型信息的情况下转成对象的二进制形式的过程,对象序列化后的形式经过正确的反序列化过程应该能够准确无误地恢复为原来的对象。即数据类型序列化与反序列化的过程分别是编码和解码的过程。6.4

二进制文件的操作Python中常用的序列化模块有json、pickle、struct、marshal等。本节主要介绍json和pickle模块。6.4.1json模块JSON(JavaScriptObjectNotation)是一个轻量级的数据交换格式,Python标准库json完美实现了该格式。json库的4个常用操作函数如表6-3所示。6.4

二进制文件的操作6.4.1json模块表6-3json库操作文件函数函数说明json.dumps(obj)将Python的数据类型转换为JSON格式,编码过程json.loads(string)将JSON格式字符串转换为Python数据类型,解码过程json.dump(obj,fp)与dumps()功能一致,输出到文件fpjson.load(fp)与loads()功能一致,从文件fp读入>>>importjson>>>json.dumps(['a','b','c'])#序列化列表对象,编码过程'["a","b","c"]'>>>json.loads(_)#反序列化,解码过程['a','b','c']>>>json.dumps({'a':1,'b':2,'c':3})'{"a":1,"b":2,"c":3}'>>>json.loads(_){'a':1,'b':2,'c':3}6.4

二进制文件的操作6.4.1json模块【例6.5】使用json模块读写文件importjsondic={'a':1,'b':[1,2,3,4,5]}withopen('test.txt','w')asfp:#将内容序列化并写入文本文件

json.dump(dic,fp)withopen('test.txt')asfp:#读取文件内容并反序列化

print(json.load(fp))运行结果为:{'a':1,'b':[1,2,3,4,5]}6.4

二进制文件的操作6.4.2pickle模块python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化。常用的两个方法:(1)pickle.dump(obj,file):序列化对象,并将结果数据流写入到文件对象中。(2)pickle.load(file):反序列化对象。将文件中的数据解析为一个Python对象。6.4

二进制文件的操作6.4.2pickle模块【例6.6】使用pickle模块写入二进制文件importpicklea='apple'b={1:'one',2:'two',3:'three'}c=['dog','cat','pig']f1=open('demo_pickle.dat','wb')pickle.dump(a,f1)pickle.dump(b,f1)pickle.dump(c,f1)f1.close()6.4

二进制文件的操作6.4.2pickle模块【例6.7】读取【例6.6】中写入的二进制文件的内容importpicklef2=open('demo_pickle.dat','rb')a2=pickle.load(f2)b2=pickle.load(f2)c2=pickle.load(f2)print(a2)print(b2)print(c2)f2.close()输出结果为:apple{1:'one',2:'two',3:'three'}['dog','cat','pig']6.5文件级操作6.5.1os与os.path模块Python的标准库中的os模块除包含普遍的操作系统功能和访问文件系统的简便方法之外,还提供了大量文件级操作的方法。如表6-4所示。表6-4os模块常用文件操作方法表方法说明access(path,mode)测试是否可以按照mode指定的权限访问文件open(path,flags,mode=0o777,*,dir_fd=None)按照mode指定的权限打开文件,默认权限为可读、可写、可执行chmod(path,mode,*,dir_fd=None,follow_symlinks=True)改变文件的访问权限listdir(path)返回path目录下的文件和目录列表remove(path)删除指定的文件,要求用户拥有删除文件的权限,并且文件没有只读或其他特殊属性rename(src,dst)重命名文件或目录,可以实现文件的移动,若目标文件已存在则抛出异常,不能跨越磁盘或分区replace(old,new)重命名文件或目录,若目标文件已存在则直接覆盖,不能跨越磁盘或分区stat(path)返回文件的所有属性6.5文件级操作6.5.1os与os.path模块os.path模块提供了大量用于路径判断、切分、连接以及文件夹遍历的方法,如表6-5所示。表6-5os.path模块常用文件操作方法方法说明abspath(path)返回绝对路径dirname(p)返回目录的路径samefile(f1,f2)测试f1和f2这两个路径是否引用的同一个文件exists(path)判断文件是否存在getsize(filename)返回文件的大小getctime(filename)返回文件的创建时间getmtime(filename)返回文件的最后修改时间getatime(filename)返回文件的最后访问时间其他详细的方法列表可以通过dir(os)和dir(os.path)查看。6.5文件级操作6.5.1os与os.path模块【例6.8】os模块和os.path模块的简单用法>>>importos>>>importos.path>>>os.path.exists(‘test.txt’)#此时文件存在True>>>os.rename('test.txt','test_new.txt')#实现文件的改名和移动>>>os.path.exists('test.txt')#原来的文件不存在了False>>>path='C:\\Users\Administrator\\Desktop\\test_new.txt'>>>os.path.dirname(path)#返回path的路径'C:\\Users\\Administrator\\Desktop'6.5文件级操作6.5.1os与os.path模块【例6.9】将当前目录的所有扩展名为“htm”的文件修改为扩展名为“html”的文件importosfile_list=[]forfilenameinos.listdir():#遍历当前目录下的文件和目录列表

iffilename.endswith('.htm'):#查找以htm结尾的文件

file_list.append(filename)forfilenameinfile_list:newname=filename[:-3]+'html'#新的扩展名为htmlos.rename(filename,newname)#重命名文件

print(filename+"重命名为:"+newname)6.5文件级操作6.5.2shutil模块shutil模块也提供了大量支持文件和文件夹操作的方法,如:1.copy(src,dst):复制文件,新文件具有同样的文件属性,如果目标文件已存在则抛出异常。2.copyfile(src,dst):复制文件,不复制文件属性,如果目标文件已存在则直接覆盖。>>>importshutil>>>shutil.copyfile('test.txt','test_new.txt')'test_new.txt'6.6

目录操作os模块常用的目录操作函数,如表6-6所示。表6-6os模块常用的目录操作函数函数名称说明mkdir(path[,mode=0o777])创建目录,要求上级目录必须存在makedirs(path1/path2…,mode=511)创建多级目录,会根据需要自动创建中间缺失的目录rmdir(path)删除目录,要求该文件夹中不能有文件或子文件夹removedirs(path1/path2…)删除多级目录getcwd()返回当前工作目录chdir(path)把path设为当前工作目录walk(top,topdown=True,onerror=None)遍历目录树,该方法返回一个元组,包括3个元素:所有路径名、所有目录列表与文件列表6.6

目录操作os模块方法演示。>>>importos>>>os.getcwd()#返回当前工作目录'D:\\lianxi\\MyPythonPro'>>>path=os.getcwd()#将path设为当前目录>>>os.mkdir(path+'\\test')#创建新目录>>>os.chdir(path+'\\test')#更改当前的工作目录>>>os.getcwd()#返回当前工作目录,已经改变'D:\\lianxi\\MyPythonPro\\test'>>>os.chdir(path)#重新将path设为当前目录>>>os.rmdir(‘test’)#删除当前目录下的test子目录6.7文件操作实例6.7.1文本文件逐行打印用户输入文件路径,以文本模式读文件内容并逐行打印,代码如下:fname=input("请输入文件名:")withopen(fname,“r”)asfp:forlineinfp.readlines():print(line)上述代码完成了题目的要求,但是存在一些缺点:当读入文件非常大时,一次性将内容读取到列表(readlines()方法返回字符串列表)中会占用很多内存,影响程序执行速度。一个合理的方法是逐行读入内容到内存,并逐行处理。Python将文件本身作为一个行序列,遍历文件的所有行可以直接按如下的方式完成。fname=input("请输入文件名:")withopen(fname,“r”)asfp:forlineinfp:print(line)注:若出现解码之类的错误,则需添加编码方式,encoding=

温馨提示

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

评论

0/150

提交评论