標籤:
python進行檔案讀寫的函數是open或file
file_handler = open(filename,,mode)
Table mode
模式 |
描述 |
r |
以讀方式開啟檔案,可讀取檔案資訊。 |
w |
以寫方式開啟檔案,可向檔案寫入資訊。如檔案存在,則清空該檔案,再寫入新內容 |
a |
以追加模式開啟檔案(即一開啟檔案,檔案指標自動移到檔案末尾),如果檔案不存在則建立 |
r+ |
以讀寫方式開啟檔案,可對檔案進行讀和寫操作。 |
w+ |
消除檔案內容,然後以讀寫方式開啟檔案。 |
a+ |
以讀寫方式開啟檔案,並把檔案指標移到檔案尾。 |
b |
以二進位模式開啟檔案,而不是以文字模式。該模式只對Windows或Dos有效,類Unix的檔案是用二進位模式進行操作的。 |
Table 檔案對象方法
方法 |
描述 |
f.close() |
關閉檔案,記住用open()開啟檔案後一定要記得關閉它,否則會佔用系統的可開啟檔案控制代碼數。 |
f.fileno() |
獲得檔案描述符,是一個數字 |
f.flush() |
重新整理輸出緩衝 |
f.isatty() |
如果檔案是一個互動終端,則返回True,否則返回False。 |
f.read([count]) |
讀出檔案,如果有count,則讀出count個位元組。 |
f.readline() |
讀出一行資訊。 |
f.readlines() |
讀出所有行,也就是讀出整個檔案的資訊。 |
f.seek(offset[,where]) |
把檔案指標移動到相對於where的offset位置。where為0表示檔案開始處,這是預設值 ;1表示當前位置;2表示檔案結尾。 |
f.tell() |
獲得檔案指標位置。 |
f.truncate([size]) |
截取檔案,使檔案的大小為size。 |
f.write(string) |
把string字串寫入檔案。 |
f.writelines(list) |
把list中的字串一行一行地寫入檔案,是連續寫入檔案,沒有換行。 |
例子如下:讀檔案Python代碼 1.read = open(result) 2. line=read.readline() 3. while line: 4. print line 5. line=read.readline()#如果沒有這行會造成死迴圈 6. read.close 寫檔案Python代碼 1.read = file(result,‘a+‘) 2. read.write("\r\n") 3. read.write("thank you") 4. read.close
二、從現有檔案中擷取資訊使用Python中的模組,可以從現有檔案中擷取資訊。使用“os”模組和“stat”模組可以擷取檔案的基本資料:1. import os 2. import stat 3. import time<div></div> 4. 5. fileStats = os.stat ( ‘test.txt‘ ) 6. fileInfo = { 7. ‘Size‘ : fileStats [ stat.ST_SIZE ], 8. ‘LastModified‘ : time.ctime ( fileStats [ stat.ST_MTIME ] ), 9. ‘LastAccessed‘ : time.ctime ( fileStats [ stat.ST_ATIME ] ), 10. ‘CreationTime‘ : time.ctime ( fileStats [ stat.ST_CTIME ] ), 11. ‘Mode‘ : fileStats [ stat.ST_MODE ] 12. } 13. 14. for infoField, infoValue in fileInfo: 15. print infoField, ‘:‘ + infoValue 16. if stat.S_ISDIR ( fileStats [ stat.ST_MODE ] ): 17. print ‘Directory. ‘ 18. else: 19. print ‘Non-directory.‘ import osimport statimport timefileStats = os.stat ( ‘test.txt‘ )fileInfo = {‘Size‘ : fileStats [ stat.ST_SIZE ],‘LastModified‘ : time.ctime ( fileStats [ stat.ST_MTIME ] ),‘LastAccessed‘ : time.ctime ( fileStats [ stat.ST_ATIME ] ),‘CreationTime‘ : time.ctime ( fileStats [ stat.ST_CTIME ] ),‘Mode‘ : fileStats [ stat.ST_MODE ]}for infoField, infoValue in fileInfo:print infoField, ‘:‘ + infoValueif stat.S_ISDIR ( fileStats [ stat.ST_MODE ] ):print ‘Directory. ‘else:print ‘Non-directory.‘上面這個例子建立了一個包含檔案基本資料的dictionary。然後顯示了相關資訊,並且告訴我們開啟的是否為目錄。我們也可以試一下開啟的是否是其它幾種類型:1. import os 2. import stat 3. 4. fileStats = os.stat ( ‘test.txt‘ ) 5. fileMode = fileStats [ stat.ST_MODE ] 6. if stat.S_ISREG ( fileStats [ stat.ST_MODE ] ): 7. print ‘Regular file.‘ 8. elif stat.S_ISDIR ( fileStats [ stat.ST_MODE ] ): 9. print ‘Directory.‘ 10. elif stat.S_ISLNK ( fileStats [ stat.ST_MODE ] ): 11. print ‘Shortcut.‘ 12. elif stat.S_ISSOCK ( fileStats [ stat.ST_MODE ] ): 13. print ‘Socket.‘ 14. elif stat.S_ISFIFO ( fileStats [ stat.ST_MODE ] ): 15. print ‘Named pipe.‘ 16. elif stat.S_ISBLK ( fileStats [ stat.ST_MODE ] ): 17. print ‘Block special device.‘ 18. elif stat.S_ISCHR ( fileStats [ stat.ST_MODE ] ): 19. print ‘Character special device.‘ import osimport statfileStats = os.stat ( ‘test.txt‘ )fileMode = fileStats [ stat.ST_MODE ]if stat.S_ISREG ( fileStats [ stat.ST_MODE ] ):print ‘Regular file.‘elif stat.S_ISDIR ( fileStats [ stat.ST_MODE ] ):print ‘Directory.‘elif stat.S_ISLNK ( fileStats [ stat.ST_MODE ] ):print ‘Shortcut.‘elif stat.S_ISSOCK ( fileStats [ stat.ST_MODE ] ):print ‘Socket.‘elif stat.S_ISFIFO ( fileStats [ stat.ST_MODE ] ):print ‘Named pipe.‘elif stat.S_ISBLK ( fileStats [ stat.ST_MODE ] ):print ‘Block special device.‘elif stat.S_ISCHR ( fileStats [ stat.ST_MODE ] ):print ‘Character special device.‘另外,我們可以使用“os.path”來擷取基本資料:1. import os.path 2. 3. fileStats = ‘test.txt‘ 4. if os.path.isdir ( fileStats ): 5. print ‘Directory.‘ 6. elif os.path.isfile ( fileStats ): 7. print ‘File.‘ 8. elif os.path.islink ( fileStats ): 9. print ‘Shortcut.‘ 10. elif os.path.ismount ( fileStats ): 11. print ‘Mount point.‘ import os.pathfileStats = ‘test.txt‘if os.path.isdir ( fileStats ):print ‘Directory.‘elif os.path.isfile ( fileStats ):print ‘File.‘elif os.path.islink ( fileStats ):print ‘Shortcut.‘elif os.path.ismount ( fileStats ):print ‘Mount point.‘
三、目錄和普通檔案一樣,關於目錄的操作也很容易掌握。首先,列出一個目錄的內容:1. import os 2. 3. for fileName in os.listdir ( ‘/‘ ): 4. print fileName import osfor fileName in os.listdir ( ‘/‘ ):print fileName正如你所見,這很簡單,用三行代碼就可以完成。建立目錄也很簡單:1. import os 2. 3. os.mkdir ( ‘testDirectory‘ ) import osos.mkdir ( ‘testDirectory‘ )刪除剛才建立的目錄:1. import os 2. 3. os.rmdir ( ‘testDirectory ) import osos.rmdir ( ‘testDirectory )嗯,可以建立多級目錄:1. import os 2. 3. os.makedirs ( ‘I/will/show/you/how/deep/the/rabbit/hole/goes‘ ) import osos.makedirs ( ‘I/will/show/you/how/deep/the/rabbit/hole/goes‘ )如果沒有在建立的檔案夾中添加任何東西,就可以一次性將它們全部刪除(即,刪除所列的所有空檔案夾):1. import os 2. 3. os.removedirs ( ‘I/will/show/you/how/deep/the/rabbit/hole/goes‘ ) import osos.removedirs ( ‘I/will/show/you/how/deep/the/rabbit/hole/goes‘ )當需要對一個特定的檔案類型進行操作時,我們可以選擇“fnmatch”模組。以下是顯示“.txt”檔案的內容和“.exe”檔案的檔案名稱:1. import fnmatch 2. import os 3. 4. for fileName in os.listdir ( ‘/‘ ): 5. if fnmatch.fnmath ( fileName, ‘*.txt‘ ): 6. print open ( fileName ).read() 7. elif fnmatch.fnmatch ( fileName, ‘*.exe‘ ): 8. print fileName import fnmatchimport osfor fileName in os.listdir ( ‘/‘ ):if fnmatch.fnmath ( fileName, ‘*.txt‘ ):print open ( fileName ).read()elif fnmatch.fnmatch ( fileName, ‘*.exe‘ ):print fileName“*”字元可以表示任意長度的字元。如果要匹配一個字元,則使用“?”符號:1. import fnmatch 2. import os 3. 4. for fileName in os.listdir ( ‘/‘ ): 5. if fnmatch.fnmatch ( fileName, ‘?.txt‘ ): 6. print ‘Text file.‘ import fnmatchimport osfor fileName in os.listdir ( ‘/‘ ):if fnmatch.fnmatch ( fileName, ‘?.txt‘ ):print ‘Text file.‘“fnmatch”模組支援Regex:1. import fnmatch 2. import os 3. import re 4. 5. filePattern = fnmatch.translate ( ‘*.txt‘ ) 6. for fileName in os.listdir ( ‘/‘ ): 7. if re.match ( filePattern, fileName ): 8. print ‘Text file.‘ import fnmatchimport osimport refilePattern = fnmatch.translate ( ‘*.txt‘ )for fileName in os.listdir ( ‘/‘ ):if re.match ( filePattern, fileName ):print ‘Text file.‘若只需要匹配一種類型的檔案,更好的辦法是使用“glob”模組。該模組的格式和“fnmatch”相似:1. import glob 2. 3. for fileName in glob.glob ( ‘*.txt‘ ): 4. print ‘Text file.‘ import globfor fileName in glob.glob ( ‘*.txt‘ ):print ‘Text file.‘使用一定範圍的字元來匹配同樣可行,就像在Regex中使用一樣。假設你想要顯示副檔名前只有一位元字的檔案的檔案名稱:1. import glob 2. 3. for fileName in glob.glob ( ‘[0-9].txt‘ ): 4. print filename import globfor fileName in glob.glob ( ‘[0-9].txt‘ ):print filename“glob”模組利用“fnmatch”模組來實現。四、資料編組使用前一節中介紹的模組,可以實現在檔案中對字串的讀寫。然而,有的時候,你可能需要傳遞其它類型的資料,如list、tuple、dictionary和其它對象。在Python中,你可以使用Pickling來完成。你可以使用Python標準庫中的“pickle”模組完成資料編組。下面,我們來編組一個包含字串和數位list:1. import pickle 2. 3. fileHandle = open ( ‘pickleFile.txt‘, ‘w‘ ) 4. testList = [ ‘This‘, 2, ‘is‘, 1, ‘a‘, 0, ‘test.‘ ] 5. pickle.dump ( testList, fileHandle ) 6. fileHandle.close() import picklefileHandle = open ( ‘pickleFile.txt‘, ‘w‘ )testList = [ ‘This‘, 2, ‘is‘, 1, ‘a‘, 0, ‘test.‘ ]pickle.dump ( testList, fileHandle )fileHandle.close()拆分編組同樣不難:1. import pickle 2. 3. fileHandle = open ( ‘pickleFile.txt‘ ) 4. testList = pickle.load ( fileHandle ) 5. fileHandle.close() import picklefileHandle = open ( ‘pickleFile.txt‘ )testList = pickle.load ( fileHandle )fileHandle.close()現在試試儲存更加複雜的資料:1. import pickle 2. 3. fileHandle = open ( ‘pickleFile.txt‘, ‘w‘ ) 4. testList = [ 123, { ‘Calories‘ : 190 }, ‘Mr. Anderson‘, [ 1, 2, 7 ] ] 5. pickle.dump ( testList, fileHandle ) 6. fileHandle.close() import picklefileHandle = open ( ‘pickleFile.txt‘, ‘w‘ )testList = [ 123, { ‘Calories‘ : 190 }, ‘Mr. Anderson‘, [ 1, 2, 7 ] ]pickle.dump ( testList, fileHandle )fileHandle.close()1. import pickle 2. 3. fileHandle = open ( ‘pickleFile.txt‘ ) 4. testList = pickle.load ( fileHandle ) 5. fileHandle.close() import picklefileHandle = open ( ‘pickleFile.txt‘ )testList = pickle.load ( fileHandle )fileHandle.close()如上所述,使用Python的“pickle”模組編組確實很簡單。眾多個物件可以通過它來儲存到檔案中。如果可以的話,“cPickle”同樣勝任這個工作。它和“pickle”模組一樣,但是速度更快:1. import cPickle 2. 3. fileHandle = open ( ‘pickleFile.txt‘, ‘w‘ ) 4. cPickle.dump ( 1776, fileHandle ) 5. fileHandle.close() import cPicklefileHandle = open ( ‘pickleFile.txt‘, ‘w‘ )cPickle.dump ( 1776, fileHandle )fileHandle.close()五、建立“虛擬”檔案你用到的許多模組包含需要檔案對象作為參數的方法。但是,有時建立並使用一個真實的檔案並讓人感到有些麻煩。所幸的是,在Python中,你可以使用“StringIO”模組來建立檔案並將其儲存在記憶體中:1. import StringIO 2. 3. fileHandle = StringIO.StringIO ( "Let freedom ring" ) 4. print fileHandle.read() # "Let freedom ring." 5. fileHandle.close() import StringIOfileHandle = StringIO.StringIO ( "Let freedom ring" )print fileHandle.read() # "Let freedom ring."fileHandle.close()cStringIO”模組同樣有效。它的使用方法和“StringIO”一樣,但就像“cPickle”之於“pickle”,它速度更快:1. import cStringIO 2. 3. fileHandle = cStringIO.cStringIO ( "To Kill a Mockingbird" ) 4. print fileHandle.read() # "To Kill a Mockingbid" 5. fileHandle.close() import cStringIOfileHandle = cStringIO.cStringIO ( "To Kill a Mockingbird" )print fileHandle.read() # "To Kill a Mockingbid"fileHandle.close()結論檔案管理,是眾多程式設計語言的程式員在編寫應用程式是經常遇到的問題。幸好,和其它語言相比,Python使其出乎意料地容易。Python的標準庫中提供了許多相關的模組協助程式員解決這方面的問題,而它的物件導向的機制也簡化了操作。好了,現在你已經瞭解了Python中檔案管理的基本知識,可以在今後的應用程式中很好地使用了。
版本vbbb
Python 讀寫檔案操作