收藏 分享(赏)

第7章+文件操作.pptx

上传人:天天快乐 文档编号:967849 上传时间:2018-05-09 格式:PPTX 页数:61 大小:979.64KB
下载 相关 举报
第7章+文件操作.pptx_第1页
第1页 / 共61页
第7章+文件操作.pptx_第2页
第2页 / 共61页
第7章+文件操作.pptx_第3页
第3页 / 共61页
第7章+文件操作.pptx_第4页
第4页 / 共61页
第7章+文件操作.pptx_第5页
第5页 / 共61页
点击查看更多>>
资源描述

1、第7章 文件操作,肖川,outline,文件基本操作文本文件基本操作二进制文件操作,文件,为了长期保存数据以便重复使用、修改和共享,必须将数据以文件的形式存储到外部存储介质(如磁盘、U盘、光盘等)或云盘中。管理信息系统是使用数据库来存储数据的,而数据库最终还是要以文件的形式存储到硬盘或其他存储介质上,应用程序的配置信息往往也是使用文件来存储的,图形、图像、音频、视频、可执行文件等等也都是以文件的形式存储在磁盘上的。因此,文件操作在各类应用软件的开发中均占有重要的地位。,文件种类,按文件中数据的组织形式把文件分为文本文件和二进制文件两类。文本文件二进制文件,文件种类 文本文件,(1)文本文件 文

2、本文件存储的是常规字符串,由若干文本行组成,通常每行以换行符n结尾。常规字符串是指记事本或其他文本编辑器能正常显示、编辑并且人类能够直接阅读和理解的字符串,如英文字母、汉字、数字字符串。文本文件可以使用字处理软件如gedit、记事本进行编辑。,文件种类 二进制文件,(2)二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用记事本或其他普通字处理软件直接进行编辑,通常也无法被人类直接阅读和理解,需要使用专门的软件进行解码后读取、显示、修改或执行。常见的如图形图像文件、音视频文件、可执行文件、资源文件、各种数据库文件、各类office文档等都属于二进制文件。,文件基本操作,IPO

3、,键盘,显示器,程序,input(.),print(.),输入设备,输出设备,文件基本操作,文件对象名 = open(文件名, 打开方式, 缓冲区)(1)文件名指定了被打开的文件名称。(2)打开模式指定了打开文件后的处理方式,见表7-1。(3)缓冲区指定了读写文件的缓存模式。0表示不缓存,1表示缓存,如大于1则表示缓冲区的大小。默认值是缓存模式。(4)open( )函数返回1个文件对象,该对象可以对文件进行各种操作。例如: f1 = open( file1.txt, r ) f2 = open( file2.txt, w),文件基本操作,文件打开方式r : 若文件不存在,则出错; 若文件存在,

4、则打开该文件。w : 若文件不存在,则创建空文件; 若文件存在,则清空文件内容。 a: 若文件不存在,则创建空文件; 若文件存在,则追加文件内容。,文件基本操作,文件常用属性,文件基本操作,文件对象常用方法,文本文件基本操作,写文件,例1:向文本文件中写入内容。,分别执行多次,结果有什么不同?,文本文件基本操作,更建议这样写:使用with自动关闭资源。可以在代码块执行完毕后还原进入该代码块时的现场。不论何种原因跳出with块,总能保证文件被正确关闭。,写文件,执行结果有什么不同?,“保存文件”对话框,模块 tkinter.filedialog函数asksaveasfilename()这个函数返

5、回一个文件名如果对话框被用户取消,那么返回None,写文件,读文件,读取并显示文本文件的前5个字符。(Python 3),读文件,例3:读取并显示文本文件所有行。,读文件,或者可以这样写:,“打开文件”对话框,模块 tkinter.filedialog函数askopenfilename()这个函数返回一个文件名如果对话框被用户取消,那么返回None,读文件,示例:拷贝文本文件,用户指定源文件及副本文件,seek(.)方法,例4:移动文件指针。Python 2.x和Python 3.x对于seek()方法的理解和处理是一致的,即将文件指针定位到文件中指定字节的位置。但是由于对中文的支持程度不一样

6、,可能会导致在Python 2.x和Python 3.x中的运行结果有所不同。例如下面的代码在Python 3.4.2中运行,当遇到无法解码的字符会抛出异常。,移动文件指针, s = 中国山东烟台SDIBT fp = open(rD:sample.txt, w) fp.write(s)11 fp.close() fp = open(rD:sample.txt, r) print(fp.read(3)中国山 fp.seek(2)2 print(fp.read(1)国, fp.seek(13)13 print(fp.read(1)D fp.seek(15)15 print(fp.read(1)B

7、fp.seek(3)3 print(fp.read(1)出错信息UnicodeDecodeError: gbk codec cant decode byte 0xfa in position 0: illegal multibyte sequence,例5:假设文本文件data.txt中每行是一个整数。读取data.txt中所有整数,将其按升序排序后再写入文本文件data_asc.txt中。,文本文件基本操作,例6:假设已有程序文件demo6.py,由此生成文件demo6_new.py,其中的内容与demo6.py一致,但是在每行的行尾加上了行号。,文本文件基本操作,例7:Python程序中代

8、码复用度检测。FindLongestReuse.py,二进制文件操作,7.3 二进制文件操作案例精选,数据库文件、图像文件、可执行文件、音视频文件、Office文档等等均属于二进制文件。对于二进制文件,不能使用记事本或其他文本编辑软件进行正常读写,也无法通过Python的文件对象直接读取和理解二进制文件的内容。必须正确理解二进制文件结构和序列化规则,才能准确地理解二进制文件内容并且设计正确的反序列化规则。所谓序列化,简单地说就是把内存中的数据在不丢失其类型信息的情况下转成对象的二进制形式的过程,对象序列化后的形式经过正确的反序列化过程应该能够准确无误地恢复为原来的对象。Python中常用的序列

9、化模块有struct、pickle、json、marshal和shelve,其中pickle有C语言实现的cPickle,速度约提高1000倍,应优先考虑使用。,7.3.1 使用pickle模块,写入文件:import picklef=open(sample_pickle.dat, wb)n=7i=13000000a=99.056s=中国人民123abclst=1, 2, 3, 4, 5, 6, 7, 8, 9tu=(-5, 10, 8)coll=4, 5, 6dic=a:apple, b:banana, g:grape, o:orangetry: pickle.dump(n, f) #表示后

10、面将要写入的数据个数 pickle.dump(i, f) #把整数i转换为字节串,并写入文件 pickle.dump(a, f) pickle.dump(s, f) pickle.dump(lst, f) pickle.dump(tu, f) pickle.dump(coll, f) pickle.dump(dic, f)except: print 写文件异常! #如果写文件异常则跳到此处执行f.close( ),7.3.1 使用pickle模块,读取二进制文件:import picklef=open(sample_pickle.dat, rb)n = pickle.load(f) #读出文件

11、的数据个数i=0while i import os import os.path os.path.exists(test1.txt)False os.rename(c:test1.txt,d:test2.txt) # 此时c:test1.txt不存在出错信息 os.rename(c:dfg.txt,d:test2.txt) # os.rename可以实现文件的改名和移动 os.path.exists(c:dfg.txt)False os.path.exists(d:dfg.txt)False os.path.exists(d:test2.txt)True path=d:mypython_exp

12、new_test.txt os.path.dirname(path)d:mypython_exp os.path.split(path)(d:mypython_exp, new_test.txt) os.path.splitdrive(path)(d:, mypython_expnew_test.txt) os.path.splitext(path)(d:mypython_expnew_test, .txt),7.4.1 os与os.path模块,列出当前目录下所有扩展名为pyc的文件 import os print fname for fname in os.listdir(os.getcw

13、d() if os.path.isfile(fname) and fname.endswith(.pyc)consts.pyc, database_demo.pyc, nqueens.pyc,7.4.1 os与os.path模块,将当前目录的所有扩展名为“html”的文件修改为扩展名为“htm”的文件:import osfile_list=os.listdir(.)for filename in file_list: pos=filename.rindex(.) if filenamepos+1:=html:newname=filename:pos+1+htm os.rename(filena

14、me,newname)print(filename+更名为:+newname),7.4.1 os与os.path模块,当然,也可以改写为下面的简洁而等价的代码:import osfile_list = filename for filename in os.listdir(.) if filename.endswith(.html)for filename in file_list: newname = filename:-4+htm os.rename(filename, newname)print(filename+更名为:+newname),7.4.2 shutil模块,例如,下面的代码

15、使用该模块的copyfile()方法复制文件。 import shutil shutil.copyfile(C:dir.txt, C:dir1.txt)下面的代码将C:Python34Dlls文件夹以及该文件夹中所有文件压缩至D:a.zip文件。 shutil.make_archive(D:a, zip, C:Python34, Dlls)D:a.zip而下面的代码则将刚压缩得到的文件D:a.zip解压缩至D:a_unpack文件夹。 shutil.unpack_archive(D:a.zip, D:a_unpack)下面的代码使用shutil模块的方法删除刚刚解压缩得到的文件夹。 shuti

16、l.rmtree(D:a_unpack),7.5 目录操作,os模块常用的目录操作函数,7.5 目录操作, import os os.getcwd() #返回当前工作目录C:Python27 os.mkdir(os.getcwd()+temp) #创建目录 os.chdir(os.getcwd()+temp) #改变当前工作目录 os.getcwd()C:Python27temp os.mkdir(os.getcwd()+test) os.listdir(.)test os.rmdir(test) #删除目录 os.listdir(.),7.5 目录操作,递归遍历文件夹import os de

17、f visitDir(path): if not os.path.isdir(path): print Error:,path, is not a directory or does not exist. return for lists in os.listdir(path): sub_path = os.path.join(path, lists) print sub_path if os.path.isdir(sub_path): visitDir(sub_path) visitDir(E:test),7.5 目录操作,使用os.walk函数遍历import os def visitDi

18、r2(path): if not os.path.isdir(path): print Error:,path, is not a directory or does not exist. return list_dirs = os.walk(path) #os.walk返回一个元组,包括3个元素:所有路径名、所有目录列表与文件列表 for root, dirs, files in list_dirs: #遍历该元组的目录和文件信息 for d in dirs: print os.path.join(root, d) #获取完整路径 for f in files: print os.path.

19、join(root, f) #获取文件绝对路径visitDir2(h:music),7.5 目录操作,使用os.path.walk函数遍历目录def visitDir3(arg,dirname,names): for filepath in names: print os.path.join(dirname,filepath)os.path.walk(h:music,visitDir3,(),7.5 目录操作,下面的代码可以用来删除当前文件夹以及所有子文件夹中特定类型的文件,其中要删除的文件类型可以在当前文件夹下的配置文件filetypes.txt中进行定义,每个文件类型的扩展名占一行。fro

20、m os.path import isdir, join, splitextfrom os import remove, listdir, getcwdfiletypes = def delCertainFiles(directory): for filename in listdir(directory): temp = join(directory, filename) if isdir(temp): delCertainFiles(temp) elif splitext(temp)1 in filetypes: # check file extension name remove(tem

21、p) print(temp, deleted.)def readFileTypes(): global filetypes with open(filetypes.txt, r) as fp: filetypes = fp.readlines() filetypes = ext.strip() for ext in filetypesdef main(): readFileTypes() print(filetypes) delCertainFiles(getcwd()main(),7.6 高级话题,计算CRC32值 import zlib print zlib.crc32(1234)-167

22、9564637 print zlib.crc32(111)1298878781 print zlib.crc32(SDIBT)2095416137 import binascii binascii.crc32(SDIBT)2095416137,7.6 高级话题,计算文本文件中最长行的长度方法一:f=open(d:test.txt,r)allLineLens=len(line.strip() for line in ff.close()longest=max(allLineLens)print longest方法二:f=open(d:test.txt,r)longest=max(len(line

23、.strip() for line in f)f.close()print longest,7.6 高级话题,计算MD5值 import hashlib import md5 md5value=hashlib.md5() md5value.update(12345) md5value=md5value.hexdigest() print md5value827ccb0eea8a706c4c34a16891f84e7b md5value=md5.md5() md5value.update(12345) md5value=md5value.hexdigest() print md5value827

24、ccb0eea8a706c4c34a16891f84e7b,7.6 高级话题,对上面的代码稍加完善,即可实现自己的MD5计算器,例如:import hashlibimport osimport sysfileName = sys.argv1if os.path.isfile(fileName): with open(fileName, r) as fp: lines = fp.readlines() data = .join(lines)print(hashlib.md5(data).hexdigest(),7.6 高级话题,另外,也可以使用ssdeep工具来计算文件的模糊哈希值或分段哈希值,

25、或者编写Python程序调用ssdeep提供的API函数来计算文件的模糊哈希值,模糊哈希值可以用来比较两个文件的相似百分比。 from ssdeep import ssdeep s = ssdeep() print s.hash_file(filename) 对于某些恶意软件来说,可能会对自身进行加壳或加密,真正运行时再进行脱壳或解密,这样一来,会使得磁盘文件的哈希值和内存中脱壳或解密后进程的哈希值相差很大。因此,根据磁盘文件和其相应的进程之间模糊哈希值的相似度可以判断该文件是否包含自修改代码,并以此来判断其为恶意软件的可能性。,7.6 高级话题,判断一个文件是否为GIF图像文件def is_

26、gif(fname):f=open(fname,r)first4=tuple(f.read(4)print first4f.close()return first4=(G,I,F,8) is_gif(c:test.gif)(G, I, F, 8)True is_gif(c:dir.txt)False,7.6 高级话题,比较两个文本文件是否相同import difflibA=file(c:dir.txt,r)B=file(c:dir1.txt,r)contextA=A.read()contextB=B.read()s=difflib.SequenceMatcher(lambda x:x=,con

27、textA,contextB)result=s.get_opcodes()for tag,i1,i2,j1,j2 in result: print(%s contextA%d:%d=%s contextB%d:%d=%s% (tag,i1,i2, contextA i1:i2,j1,j2, contextBj1:j2),7.6 高级话题,使用xlwt写入Excel文件from xlwt import *book = Workbook()sheet1 = book.add_sheet(First)al=Alignment()al.horz=Alignment.HORZ_CENTERal.vert

28、=Alignment.VERT_CENTERborders=Borders()borders.bottom=Borders.THICKstyle=XFStyle()style.alignment=alstyle.borders=bordersrow0=sheet1.row(0)row0.write(0,test,style=style)book.save(rd:test.xls),7.6 高级话题,使用xlrd读取Excel文件 import xlrd book = xlrd.open_workbook(rd:test.xls) sheet1 = book.sheet_by_name(Firs

29、t) row0 = sheet1.row(0) print row00text:utest print row00.valuetest,7.6 高级话题,使用Pywin32操作Excel文件xlApp = win32com.client.Dispatch(Excel.Application) #打开EXCELxlBook = xlApp.Workbooks.Open(D:1.xls) xlSht = xlBook.Worksheets(sheet1) aaa = xlSht.Cells(1,2).Value xlSht.Cells(2,3).Value = aaa xlBook.Close(S

30、aveChanges=1) del xlApp pywin32_excel.py,7.6 高级话题,检查word文档的连续重复字。在word文档中,经常会由于键盘操作不小心而使得文档中出现连续的重复字,例如“用户的的资料”或“需要需要用户输入”之类的情况。下面的代码使用Pywin32模块中win32com对word文档进行检查并提示类似的重复汉字。,7.6 高级话题,import sysfrom win32com import client#filename = sys.argv1filename = rc:test.docword = client.Dispatch(Word.Applica

31、tion)#newdoc = word.Documents.Add()doc = word.Documents.Open(filename)content = str(doc.Content)doc.Close()#newdoc.Close()word.Quit()repeatedWords = lens = len(content)for i in range(lens-2): ch = contenti ch1 = contenti+1 ch2 = contenti+2 if (uu4e00=ch=uu9fa5 or ch in (,, 。, 、): if ch=ch1 and ch+ch1 not in repeatedWords: print(ch+ch1) repeatedWords.append(ch+ch1) elif ch=ch2 and ch+ch1+ch2 not in repeatedWords: print(ch+ch1+ch2) repeatedWords.append(ch+ch1+ch2),

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报