一、python中文件管理
文件管理是很多應用程序的基本功能和重要組成部分。Python可以使文件管理極其簡單,特別是和其它語言相對比。
1.介紹
幾乎以任何語言編寫的眾多應用程序中,文件管理是很重要的一部分。Python當然也不例外。在這篇文章中,我們將探究如何使用一些模塊來操作文件。我們會完成讀文件,寫文件,增加文件內容的操作,寫文件,增加文件內容的操作,還有一些另類的用法。
2.文件讀寫
最簡單文件操作--讀取
1 FileRead = open("test.txt",'r') 2 FileRead.read() #讀取文件所有內容,使用print(FileRead.read())函數輸出文件內容 3 FileRead.close()
1 FileRead = open("test.txt",'r') 2 for lines in FileRead.readlines(): 3 print("lines:",lines.strip('\n')) 4 FileRead.close() 5 6 #輸出結果 7 lines: Hello World 8 lines: Welcome To Beijing
1 FileRead = open("test.txt",'r') 2 print(FileRead.readline().strip('\n')) #讀取第一行數據 3 print(FileRead.readline().strip('\n')) #讀取第二行數據 4 FileRead.close()
1 FileRead = open("test.txt",'r') 2 print(FileRead.readline().strip('\n')) #讀取第一行數據 3 FileRead.seek(0) #將上次讀取的位置調回到首行位置 4 print(FileRead.readline().strip('\n')) #讀取第一行數據 5 FileRead.close()
1 FileRead = open("test.txt",'r') 2 print(FileRead.readline().strip('\n')) #讀取第一行數據 3 print(FileRead.tell()) #獲取python所在文件中的當前位置 4 print(FileRead.readline().strip('\n')) #讀取第二行數據 5 FileRead.close()
初級操作--寫數據到文件
1 FileRead = open("test.txt",'w') #‘w’--是指文件將被寫入數據,已有的數據將會被清空 2 FileRead.write('Hello Everybody!\nWelcome To China!') #被寫入文件的數據,使用‘\n’可以實現換行操作 3 FileRead.close() #關閉文件句柄,每次讀寫文件都應該在最后面將文件關閉
1 FileRead = open("test.txt",'a') #‘a’--是指文件將被寫入數據,已有的數據不會被清空,在已有數據后面追加下面要添加的數據 2 FileRead.write('Hello Everybody!\nWelcome To China!') #被寫入文件的數據,使用‘\n’可以實現換行操作 3 FileRead.close() #關閉文件句柄,每次讀寫文件都應該在最后面將文件關閉
文件的高級操作--‘rb’ 'wb'--使用此模式打開文件是讀寫二進制文件
二、從現有文件中獲取數據
使用Python中的模塊,可以從現有文件中獲取信息。使用“os”模塊和“stat”模塊可以獲取文件的基本信息:
1 #!/usr/local/env python3 2 ''' 3 Author:@南非波波 4 Blog:http://www.cnblogs.com/songqingbo/ 5 E-mail:qingbo.song@gmail.com 6 ''' 7 import os 8 import stat 9 import time 10 FileStats = os.stat('test.txt') #獲取文件的基本信息 11 FileInfo = { 12 'Size' : FileStats [ stat.ST_SIZE ], #文件大小 13 'LastModified' : time.ctime(FileStats[ stat.ST_MTIME]), 14 'LastAccessed' : time.ctime(FileStats[stat.ST_ATIME]), 15 'CreationTime' : time.ctime(FileStats[stat.ST_CTIME]), 16 'Mode' : FileStats [ stat.ST_MODE ] 17 } 18 print(FileStats) #os.stat_result(st_mode=33206, st_ino=6473924464448069, st_dev=434835, st_nlink=1, st_uid=0, st_gid=0, st_size=70, st_atime=1451980042, st_mtime=1451981189, st_ctime=1451979747) 19 print(FileInfo) #{'Size': 70, 'Mode': 33206, 'LastAccessed': 'Tue Jan 5 15:47:22 2016', 'LastModified': 'Tue Jan 5 16:06:29 2016', 'CreationTime': 'Tue Jan 5 15:42:27 2016'}
判斷文件是不是目錄
1 #!/usr/local/env python3 2 ''' 3 Author:@南非波波 4 Blog:http://www.cnblogs.com/songqingbo/ 5 E-mail:qingbo.song@gmail.com 6 ''' 7 import os 8 import stat 9 import time 10 def DirIf(FilenName): 11 FileStats = os.stat(FilenName) #獲取文件的基本信息 12 FileInfo = { 13 'Size' : FileStats [ stat.ST_SIZE ], #文件大小 14 'LastModified' : time.ctime(FileStats[ stat.ST_MTIME]), 15 'LastAccessed' : time.ctime(FileStats[stat.ST_ATIME]), 16 'CreationTime' : time.ctime(FileStats[stat.ST_CTIME]), 17 'Mode' : FileStats [ stat.ST_MODE ] 18 } 19 if stat.S_ISDIR( FileStats[ stat.ST_MODE ] ): #判斷文件是不是目錄 20 return True 21 else: 22 return False
if DirIf('test.txt') == True:
print("目錄")
elif DirIf('test.txt') == False:
print('非目錄')
判斷文件類型
1 #!/usr/local/env python3 2 ''' 3 Author:@南非波波 4 Blog:http://www.cnblogs.com/songqingbo/ 5 E-mail:qingbo.song@gmail.com 6 ''' 7 import os 8 import stat 9 10 FileStats = os.stat('test.txt') 11 FileMode = FileStats[stat.ST_MODE] 12 if stat.S_ISREG(FileStats[stat.ST_MODE]): #普通文件判斷 13 print('Regular file.') 14 elif stat.S_ISDIR(FileStats[stat.ST_MODE]): #目錄文件判斷 15 print('Directory.') 16 elif stat.S_ISLNK(FileStats[stat.ST_MODE]): #快捷方式(鏈接)文件 17 print('Shortcut.') 18 elif stat.S_ISSOCK(FileStats[stat.ST_MODE]): #套接字文件 19 print('Socket.') 20 elif stat.S_ISFIFO(FileStats[stat.ST_MODE]): #命名管道文件 21 print('Named pipe.') 22 elif stat.S_ISBLK(FileStats[stat.ST_MODE]): #塊設備文件 23 print('Block special device.') 24 elif stat.S_ISCHR(FileStats[stat.ST_MODE]): #特殊字符型文件 25 print('Character special device.')
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.')
獲取文件中的行數
def Countnum(filename): files = open(filename) data = files.read() files.flush() files.close() return data.count('\n')
三、python對目錄的操作
和普通文件一樣,關於目錄的操作也很容易掌握。首先,列出一個目錄的內容:
1 import os 2 for fileName in os.listdir ( '/' ): 3 print(fileName)
創建目錄
import os
os.mkdir('testDir')
創建多級目錄
import os
os.makedirs('testDir/test2/test3/test4') #os.makedirs()
刪除多級空目錄
import os
os.removedirs('testDir/test2/test3/test4')
刪除目錄
import os
os.rmdir('testDir')
四、python對特定類型的文件進行操作
使用fnmatch模塊顯示'.txt'和'.exe'文件名
1 import fnmatch 2 import os 3 for FileName in os.listdir('/'): 4 if fnmatch.fnmatch(FileName,'*.txt'): 5 print(open(FileName).read()) 6 elif fnmatch.fnmatch(FileName,'*.exe'): 7 print(FileName)
“fnmatch”模塊支持正則表達式:
import fnmatch import os import re FilePattern = fnmatch.translate('*.txt') for FileName in os.listdir('./'): if re.match(FilePattern,FileName): print('Text file.')
使用glob模塊查找一種類型的文件比較方便
import glob for FileName in glob.glob('*.txt'): print(FileName) print('Text file.')
使用數字匹配文件名
import glob for FileName in glob.glob ( '[0-9].txt' ): print(Filename)
五、數據編組
使用前一節中介紹的模塊,可以實現在文件中對字符串的讀寫。然而,有的時候,你可能需要傳遞其它類型的數據,如list、tuple、dictionary和其它對象。在Python中,你可以使用Pickling來完成。你可以使用Python標准庫中的“pickle”模塊完成數據編組。
編組一個包含數字和字符的列表:
#!/usr/local/env python3 ''' Author:@南非波波 Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song@gmail.com ''' import pickle FileHandle = open( 'PickleFile.txt','wb') TestList = ['This',2,'is',1,'a',0,'test.'] pickle.dump(TestList,FileHandle ) FileHandle.close()
拆分編組:
#!/usr/local/env python3 ''' Author:@南非波波 Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song@gmail.com ''' import pickle FileHandle = open('PickleFile.txt','rb') #注意要加'b'進行二進制讀寫操作,否則報錯 TestList = pickle.load(FileHandle) print(TestList) FileHandle.close()
錯誤
TypeError: must be str, not bytes錯誤: 解答: 寫文件處 open(filename, 'w').write 應該寫為 open(filename, 'wb').write
復雜編組:
import pickle FileHandle = open('PickleFile.txt','wb') TestList = [ 123, { 'Calories' : 190 }, 'swht', [ 1, 2, 7 ] ] pickle.dump(TestList,FileHandle) FileHandle.close()
拆組:
import pickle FileHandle = open('PickleFile.txt','rb') TestList = pickle.load(FileHandle) print(TestList) FileHandle.close()
比較:在python2.7版本里還有一個模塊,相對於pickle模塊而言,處理速度更快。當然在python3已經將其去掉,或者將其性能整合到pickle模塊中了。
#!/usr/local/env python2 ''' Author:@南非波波 Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song@gmail.com ''' import cPickle FileHandle = open('PickleFile.txt','wb') TestList = [ 123, { 'Calories' : 190 }, 'swht', [ 1, 2, 7 ] ] cPickle.dump(TestList,FileHandle) FileHandle.close()
六、創建虛擬文件
你用到的許多模塊包含需要文件對象作為參數的方法。但是,有時創建並使用一個真實的文件並讓人感到有些麻煩。所幸的是,在Python中,你可以使用“StringIO”或者“cStringIO”模塊來創建文件並將其保存在內存中,但很不幸的是,這兩個模塊在python3中都已經被移除。如果你使用的是python2的環境,可以嘗試使用一下:
#!/usr/local/env python2 ''' Author:@南非波波 Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song@gmail.com ''' import StringIO FileHandle = StringIO.StringIO("Let freedom ring") #創建的文件存在內存中 print(FileHandle.read()) # "Let freedom ring." FileHandle.close()
#!/usr/local/env python2 ''' Author:@南非波波 Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song@gmail.com ''' import cStringIO FileHandle = cStringIO.cStringIO("Let freedom ring") #創建的文件存在內存中 print(FileHandle.read()) # "Let freedom ring." FileHandle.close()
總結:
文件管理,是眾多編程語言的程序員在編寫應用程序是經常遇到的問題。幸好,和其它語言相比,Python使其出乎意料地容易。Python的標准庫中提供了許多相關的模塊幫助程序員解決這方面的問題,而它的面向對象的機制也簡化了操作。
原文鏈接:http://blog.csdn.net/wwwjfy/article/details/2575942
