python 文件操作


一、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
文件循環讀取行
Python在讀取一個文件時,會記住其在文件中的位置。所有在調用FileRead.readline()的時候會從上次讀取的位置開始
1 FileRead = open("test.txt",'r')
2 print(FileRead.readline().strip('\n')) #讀取第一行數據
3 print(FileRead.readline().strip('\n')) #讀取第二行數據
4 FileRead.close()
文件讀取行操作
使用seek(0)將文件讀取的行位置標記到指定的位置
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()
文件讀取行操作
使用tell()獲取python在文件中的當前位置
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()
獲取python在文件中的當前位置

  初級操作--寫數據到文件

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.')
使用os.path()判斷文件類型

  獲取文件中的行數

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)
python搜索指定類型的文件

  “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://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=402454450&idx=2&sn=2f20a3df2a031beb689fe330b227935c&scene=23&srcid=0103i7fhuH1utpUpJSPeg9pW#rd

原文鏈接:http://blog.csdn.net/wwwjfy/article/details/2575942

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM