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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

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

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

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

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

6、的支持程度不一樣,可能會(huì)導(dǎo)致在Python 2.x和Python 3.x中的運(yùn)行結(jié)果有所不同。例如下面的代碼在Python 3.4.2中運(yùn)行,當(dāng)遇到無(wú)法解碼的字符會(huì)拋出異常。移動(dòng)文件指針 s = 中國(guó)山東煙臺(tái)SDIBT fp = open(rD:sample.txt, w) fp.write(s)11 fp.close() fp = open(rD:sample.txt, r) print(fp.read(3)中國(guó)山 fp.seek(2)2 print(fp.read(1)國(guó) 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)出錯(cuò)信息UnicodeDecodeError: gbk codec cant decode byte 0 xfa in position 0: illegal multibyte sequence例5:假設(shè)文本文件data.txt中每行是一個(gè)整數(shù)。讀取data.txt中所有整數(shù),將其按升序排序后再寫(xiě)入文本文件data_asc.txt中。文本文件基本操作例6:假設(shè)已有程序文件demo6.py,由此生成文件demo6_new.py,其中的內(nèi)容與demo6.py一致,但是在每行的行尾加上了行號(hào)。文本文件基本操作例7:Python程序中

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

9、塊有struct、pickle、json、marshal和shelve,其中pickle有C語(yǔ)言實(shí)現(xiàn)的cPickle,速度約提高1000倍,應(yīng)優(yōu)先考慮使用。7.3.1 使用pickle模塊寫(xiě)入文件:import picklef=open(sample_pickle.dat, wb)n=7i=13000000a=99.056s=中國(guó)人民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) #表示后面將要寫(xiě)

10、入的數(shù)據(jù)個(gè)數(shù) pickle.dump(i, f) #把整數(shù)i轉(zhuǎn)換為字節(jié)串,并寫(xiě)入文件 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 寫(xiě)文件異常! #如果寫(xiě)文件異常則跳到此處執(zhí)行f.close( )7.3.1 使用pickle模塊讀取二進(jìn)制文件:import picklef=open(sample_pickle.dat, rb)n = pickle.load(f) #讀出文件的數(shù)據(jù)個(gè)數(shù)i

11、=0while i import os import os.path os.path.exists(test1.txt)False os.rename(c:test1.txt,d:test2.txt) # 此時(shí)c:test1.txt不存在出錯(cuò)信息 os.rename(c:dfg.txt,d:test2.txt) # os.rename可以實(shí)現(xiàn)文件的改名和移動(dòng) 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模塊列出當(dāng)前目錄下所有擴(kuò)展名為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模塊將當(dāng)前目錄的所有擴(kuò)展名為“html”的文件修改為擴(kuò)展名為“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模塊當(dāng)然,也可以改寫(xiě)為下面的簡(jiǎn)潔而等價(jià)的代碼: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、()方法復(fù)制文件。 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ù)名稱使用說(shuō)明mkdir(path,mode=0777)創(chuàng)建目錄makedirs(path1/path2,mode=511)創(chuàng)建多級(jí)目錄rmdir(path)刪除目錄removedirs(path1/path2)刪除多級(jí)目錄listdir(path)返回指定目錄下所有文件信息getcwd()返回當(dāng)前工作目錄chdir(path)把path設(shè)為當(dāng)前工作目錄Walk(top,topdown=True,onrror=None)遍歷目錄樹(shù)7.5 目錄操作 import os os.getcwd() #返回當(dāng)前工作目錄C:Python27 os.m

17、kdir(os.getcwd()+temp) #創(chuàng)建目錄 os.chdir(os.getcwd()+temp) #改變當(dāng)前工作目錄 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返回一個(gè)元組,包括3個(gè)元素:所有路徑名、所有目錄列表與文件列表 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) #獲取文件絕對(duì)路徑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 目錄操作下面的代碼可以用來(lái)刪除當(dāng)前文件夾以及所有子文件夾中特定類型的文件,其中要?jiǎng)h除的文件類型可以在當(dāng)前文件夾下的配置文件filetypes.txt中進(jìn)行定義,每個(gè)文件類型的擴(kuò)展名占一行。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 高級(jí)話題計(jì)算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 高級(jí)話題計(jì)算文本文件中最長(zhǎng)行的長(zhǎng)度方法一: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 高級(jí)話題計(jì)算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 高級(jí)話題對(duì)上面的代碼稍加完善,即可實(shí)現(xiàn)自己的MD5計(jì)算器,例如: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 高級(jí)話題另外,也可以使用ssdeep工具來(lái)計(jì)算文件的模糊哈希值或分段哈希值,或者編寫(xiě)Python程序調(diào)用ssdeep提供的API函數(shù)來(lái)計(jì)算文件的模糊哈希值,模糊哈希值可以用來(lái)比較兩個(gè)文件的相似百分比。 from ssdeep import ssdeep s = ssdeep() print s.hash_fil

26、e(filename) 對(duì)于某些惡意軟件來(lái)說(shuō),可能會(huì)對(duì)自身進(jìn)行加殼或加密,真正運(yùn)行時(shí)再進(jìn)行脫殼或解密,這樣一來(lái),會(huì)使得磁盤文件的哈希值和內(nèi)存中脫殼或解密后進(jìn)程的哈希值相差很大。因此,根據(jù)磁盤文件和其相應(yīng)的進(jìn)程之間模糊哈希值的相似度可以判斷該文件是否包含自修改代碼,并以此來(lái)判斷其為惡意軟件的可能性。7.6 高級(jí)話題判斷一個(gè)文件是否為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 高級(jí)話題比較兩個(gè)文本文件是否相同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 高級(jí)話題使用xlwt寫(xiě)入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 高級(jí)話題使用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 高級(jí)話題使用Pywin32操作Excel文件xlAp

溫馨提示

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

評(píng)論

0/150

提交評(píng)論