第7章+文件操作_第1頁
第7章+文件操作_第2頁
第7章+文件操作_第3頁
第7章+文件操作_第4頁
第7章+文件操作_第5頁
已閱讀5頁,還剩56頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第7章 文件操作肖川outline文件基本操作文本文件基本操作二進制文件操作文件為了長期保存數(shù)據(jù)以便重復使用、修改和共享,必須將數(shù)據(jù)以文件的形式存儲到外部存儲介質(如磁盤、U盤、光盤等)或云盤中。管理信息系統(tǒng)是使用數(shù)據(jù)庫來存儲數(shù)據(jù)的,而數(shù)據(jù)庫最終還是要以文件的形式存儲到硬盤或其他存儲介質上,應用程序的配置信息往往也是使用文件來存儲的,圖形、圖像、音頻、視頻、可執(zhí)行文件等等也都是以文件的形式存儲在磁盤上的。因此,文件操作在各類應用軟件的開發(fā)中均占有重要的地位。文件種類按文件中數(shù)據(jù)的組織形式把文件分為文本文件和二進制文件兩類。文本文件二進制文件文件種類 文本文件(1)文本文件 文本文件存儲的是常規(guī)

2、字符串,由若干文本行組成,通常每行以換行符n結尾。常規(guī)字符串是指記事本或其他文本編輯器能正常顯示、編輯并且人類能夠直接閱讀和理解的字符串,如英文字母、漢字、數(shù)字字符串。文本文件可以使用字處理軟件如gedit、記事本進行編輯。文件種類 二進制文件(2)二進制文件 二進制文件把對象內(nèi)容以字節(jié)串(bytes)進行存儲,無法用記事本或其他普通字處理軟件直接進行編輯,通常也無法被人類直接閱讀和理解,需要使用專門的軟件進行解碼后讀取、顯示、修改或執(zhí)行。常見的如圖形圖像文件、音視頻文件、可執(zhí)行文件、資源文件、各種數(shù)據(jù)庫文件、各類office文檔等都屬于二進制文件。文件基本操作IPO鍵盤顯示器程序input(

3、.)print(.)文件readline(.)等等文件write(.)等等輸入設備輸入設備輸輸出出設備設備文件基本操作文件對象名 = open(文件名, 打開方式, 緩沖區(qū))(1)文件名指定了被打開的文件名稱。(2)打開模式指定了打開文件后的處理方式,見表7-1。(3)緩沖區(qū)指定了讀寫文件的緩存模式。0表示不緩存,1表示緩存,如大于1則表示緩沖區(qū)的大小。默認值是緩存模式。(4)open( )函數(shù)返回1個文件對象,該對象可以對文件進行各種操作。例如: f1 = open( file1.txt, r ) f2 = open( file2.txt, w)文件基本操作文件打開方式r : 若文件不存在,

4、則出錯; 若文件存在,則打開該文件。w : 若文件不存在,則創(chuàng)建空文件; 若文件存在,則清空文件內(nèi)容。 a: 若文件不存在,則創(chuàng)建空文件; 若文件存在,則追加文件內(nèi)容。文件基本操作文件常用屬性文件基本操作文件對象常用方法文本文件基本操作寫文件例1:向文本文件中寫入內(nèi)容。分別執(zhí)行多次,結果有什么不同?分別執(zhí)行多次,結果有什么不同?文本文件基本操作更建議這樣寫:使用with自動關閉資源??梢栽诖a塊執(zhí)行完畢后還原進入該代碼塊時的現(xiàn)場。不論何種原因跳出with塊,總能保證文件被正確關閉。寫文件執(zhí)行結果有什么不同?執(zhí)行結果有什么不同?“保存文件”對話框模塊 tkinter.filedialog函數(shù)as

5、ksaveasfilename()這個函數(shù)返回一個文件名如果對話框被用戶取消,那么返回None寫文件讀文件讀取并顯示文本文件的前5個字符。(Python 3)讀文件例3:讀取并顯示文本文件所有行。讀文件或者可以這樣寫:“打開文件”對話框模塊 tkinter.filedialog函數(shù)askopenfilename()這個函數(shù)返回一個文件名如果對話框被用戶取消,那么返回None讀文件示例:拷貝文本文件用戶指定源文件及副本文件seek(.)方法例4:移動文件指針。Python 2.x和Python 3.x對于seek()方法的理解和處理是一致的,即將文件指針定位到文件中指定字節(jié)的位置。但是由于對中文

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

7、(1)B fp.seek(3)3 print(fp.read(1)出錯信息UnicodeDecodeError: gbk codec cant decode byte 0 xfa in position 0: illegal multibyte sequence例5:假設文本文件data.txt中每行是一個整數(shù)。讀取data.txt中所有整數(shù),將其按升序排序后再寫入文本文件data_asc.txt中。文本文件基本操作例6:假設已有程序文件demo6.py,由此生成文件demo6_new.py,其中的內(nèi)容與demo6.py一致,但是在每行的行尾加上了行號。文本文件基本操作例7:Python程序中

8、代碼復用度檢測。FindLongestReuse.py二進制文件操作7.3 二進制文件操作案例精選數(shù)據(jù)庫文件、圖像文件、可執(zhí)行文件、音視頻文件、Office文檔等等均屬于二進制文件。對于二進制文件,不能使用記事本或其他文本編輯軟件進行正常讀寫,也無法通過Python的文件對象直接讀取和理解二進制文件的內(nèi)容。必須正確理解二進制文件結構和序列化規(guī)則,才能準確地理解二進制文件內(nèi)容并且設計正確的反序列化規(guī)則。所謂序列化,簡單地說就是把內(nèi)存中的數(shù)據(jù)在不丟失其類型信息的情況下轉成對象的二進制形式的過程,對象序列化后的形式經(jīng)過正確的反序列化過程應該能夠準確無誤地恢復為原來的對象。Python中常用的序列化模

9、塊有struct、pickle、json、marshal和shelve,其中pickle有C語言實現(xiàn)的cPickle,速度約提高1000倍,應優(yōu)先考慮使用。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、入的數(shù)據(jù)個數(shù) pickle.dump(i, f) #把整數(shù)i轉換為字節(jié)串,并寫入文件 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 寫文件異常! #如果寫文件異常則跳到此處執(zhí)行f.close( )7.3.1 使用pickle模塊讀取二進制文件:import picklef=open(sample_pickle.dat, rb)n = pickle.load(f) #讀出文件的數(shù)據(jù)個數(shù)i

11、=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可以實現(xiàn)文件的改名和移動 os.path.exists(c:dfg.txt)False os.path.exists(d:dfg.txt)False os.path.exists(d:test2.txt)True path=d:mypython_expnew_te

12、st.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.getcwd() if o

13、s.path.isfile(fname) and fname.endswith(.pyc)consts.pyc, database_demo.pyc, nqueens.pyc7.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(filename,newname

14、)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模塊例如,下面的代碼使用該模塊的copyfile

15、()方法復制文件。 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模塊的方法刪除剛剛解壓縮得到的文件夾。 shutil.rmtree(D:a_u

16、npack)7.5 目錄操作os模塊常用的目錄操作函數(shù)函數(shù)名稱使用說明mkdir(path,mode=0777)創(chuàng)建目錄makedirs(path1/path2,mode=511)創(chuàng)建多級目錄rmdir(path)刪除目錄removedirs(path1/path2)刪除多級目錄listdir(path)返回指定目錄下所有文件信息getcwd()返回當前工作目錄chdir(path)把path設為當前工作目錄Walk(top,topdown=True,onrror=None)遍歷目錄樹7.5 目錄操作 import os os.getcwd() #返回當前工作目錄C:Python27 os.m

17、kdir(os.getcwd()+temp) #創(chuàng)建目錄 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 def visitDir(path): if not os.path.isdir(path): print Error:,path, is not a directory or does not exist.

18、 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函數(shù)遍歷import os def visitDir2(path): if not os.path.isdir(path): print Error:,path, is not a directory or does not exist. return li

19、st_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.join(root, f) #獲取文件絕對路徑visitDir2(h:music)7.5 目錄操作使用os.path.walk函數(shù)遍歷目錄def visitDir3(arg,dirname,names): f

20、or filepath in names: print os.path.join(dirname,filepath)os.path.walk(h:music,visitDir3,()7.5 目錄操作下面的代碼可以用來刪除當前文件夾以及所有子文件夾中特定類型的文件,其中要刪除的文件類型可以在當前文件夾下的配置文件filetypes.txt中進行定義,每個文件類型的擴展名占一行。from os.path import isdir, join, splitextfrom os import remove, listdir, getcwdfiletypes = def delCertainFiles(

21、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(temp) print(temp, deleted.)def readFileTypes(): global filetypes with open(filetypes.txt, r) as fp: filetypes =

22、 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)-1679564637 print zlib.crc32(111)1298878781 print zlib.crc32(SDIBT)2095416137 import binascii binascii.crc32(SDIBT

23、)20954161377.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.strip() for line in f)f.close()print longest7.6 高級話題計算MD5值 import hashlib import md5 md5value=hashlib.md5() md5

24、value.update(12345) md5value=md5value.hexdigest() print md5value827ccb0eea8a706c4c34a16891f84e7b md5value=md5.md5() md5value.update(12345) md5value=md5value.hexdigest() print md5value827ccb0eea8a706c4c34a16891f84e7b7.6 高級話題對上面的代碼稍加完善,即可實現(xiàn)自己的MD5計算器,例如:import hashlibimport osimport sysfileName = sys.a

25、rgv1if os.path.isfile(fileName): with open(fileName, r) as fp: lines = fp.readlines() data = .join(lines)print(hashlib.md5(data).hexdigest()7.6 高級話題另外,也可以使用ssdeep工具來計算文件的模糊哈希值或分段哈希值,或者編寫Python程序調用ssdeep提供的API函數(shù)來計算文件的模糊哈希值,模糊哈希值可以用來比較兩個文件的相似百分比。 from ssdeep import ssdeep s = ssdeep() print s.hash_fil

26、e(filename) 對于某些惡意軟件來說,可能會對自身進行加殼或加密,真正運行時再進行脫殼或解密,這樣一來,會使得磁盤文件的哈希值和內(nèi)存中脫殼或解密后進程的哈希值相差很大。因此,根據(jù)磁盤文件和其相應的進程之間模糊哈希值的相似度可以判斷該文件是否包含自修改代碼,并以此來判斷其為惡意軟件的可能性。7.6 高級話題判斷一個文件是否為GIF圖像文件def is_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,

27、 8)True is_gif(c:dir.txt)False7.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=,contextA,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

28、, 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=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(First) row0 = sheet1.row(0) print row00text:utest print row00.valuetest7.6 高級話題使用Pywin32操作Excel文件xlAp

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論