檔案處理的函數和方法
使用Open()函數可開啟檔案,文法格式如下:
代碼如下:
file_handler = open(filename,[,mode[,bufsize]]
filename是你要操作的檔案名稱,如果不在當前路徑,需指出具體路徑。mode是開啟檔案的模式,表示你要如何操作檔案,bufsize表示是否使用緩衝。
mode
| 模式 |
描述 |
| r |
以讀方式開啟檔案,可讀取檔案資訊。 |
| w |
以寫方式開啟檔案,可向檔案寫入資訊。 |
| a |
以追加方式開啟檔案,檔案指標自動移到檔案尾。 |
| r+ |
以讀寫方式開啟檔案,可對檔案進行讀和寫操作。 |
| w+ |
消除檔案內容,然後以讀寫方式開啟檔案。 |
| a+ |
以讀寫方式開啟檔案,並把檔案指標移到檔案尾。 |
| b |
以二進位模式開啟檔案,而不是以文字模式。該模式只對Windows或Dos有效,類Unix的檔案是用二進位模式進行操作的。 |
bufsize
| bufsize取值 |
描述 |
| 0 |
禁用緩衝 |
| 1 |
行緩衝 |
| >1 |
指定緩衝區的大小 |
| <1 |
系統預設的緩衝區大小 |
open()函數返回一個檔案對象,我們可通過read()或write()函數對檔案進行讀寫操作,下面是一些檔案對象方法:
檔案對象方法
| 方法 |
描述 |
| 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位置。offset為0表示檔案開始處,這是預設值 ;1表示當前位置;2表示檔案結尾。 |
| f.tell() |
獲得檔案指標位置。 |
| f.truncate([size]) |
截取檔案,使檔案的大小為size。 |
| f.write(string) |
把string字串寫入檔案。 |
| f.writelines(list) |
把list中的字串一行一行地寫入檔案。 |
樣本
1.檔案的開啟或建立
代碼如下:
#!/usr/bin/env python
#-*- encoding:UTF-8 -*-
filehandler = open('test.txt','w') #以寫入模式開啟檔案,如果檔案不存在則建立
filehandler.write('this is a file open/create test.\nthe second line.')
filehandler.close()
#!/usr/bin/env python
#-*- encoding:UTF-8 -*-
filehandler = open('test.txt','a') #以追加模式開啟檔案,如果檔案不存在則建立
filehandler.write('\nappend the text in another line.\n')
filehandler.close()
2.讀取檔案
代碼如下:
#!/usr/bin/env python
#-*- encoding:UTF-8 -*-
filehandler = open('test.txt','r') #以讀方式開啟檔案,rb為二進位方式(片或可執行檔等)
print 'read() function:' #讀取整個檔案
print filehandler.read()
print 'readline() function:' #返迴文件頭,讀取一行
filehandler.seek(0)
print filehandler.readline()
print 'readlines() function:' #返迴文件頭,返回所有行的列表
filehandler.seek(0)
print filehandler.readlines()
print 'list all lines' #返迴文件頭,顯示所有行
filehandler.seek(0)
textlist = filehandler.readlines()
for line in textlist:
print line
print 'seek() function' #移位到第32個字元,從33個字元開始顯示餘下內容
filehandler.seek(32)
print filehandler.read()
print 'tell() function' #移位到檔案頭,從頭開始顯示2位字元
filehandler.seek(0)
print filehandler.readline() #顯示第一行內容
print filehandler.tell() #顯示當前位置
print filehandler.readline() #顯示第二行內容
print filehandler.read() #顯示餘下所有內容
filehandler.close() #關閉檔案控制代碼
3.檔案系統操作
代碼如下:
#!/usr/bin/env python
#-*- encoding:utf-8 -*-
import os,fnmatch,glob
for fileName in os.listdir ( '/root' ): #列出/root目錄內容,不包括.和..
print fileName
os.mkdir('py') #在目前的目錄下建立一個py目錄,且只能建立一層
os.rmdir( 'py') #在目前的目錄下刪除py目錄,且只能刪除一層
os.makedirs('py/aa') #可建立多層目錄
os.removedirs('py/aa') #可刪除多層目錄
print 'demonstration fnmatch module'
for fileName in os.listdir ( '/root/python/file' ):
if fnmatch.fnmatch(fileName,'*.txt'): #利用UNIX風格的通配,只顯示尾碼為txt的檔案
print fileName
print 'demonstration glob module'
for fileName in glob.glob ( '*.txt' ): #利用UNIX風格的通配,只顯示尾碼為txt的檔案
print fileName
4.擷取檔案狀態
代碼如下:
#!/usr/bin/env python
#-*- encoding:UTF-8 -*-
import os,time,stat
fileStats = 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 ] #擷取檔案的模式
}
#print fileInfo
for field in fileInfo: #顯示對象內容
print '%s:%s' % (field,fileInfo[field])
#for infoField,infoValue in fileInfo:
# print '%s:%s' % (infoField,infoValue)
if stat.S_ISDIR ( fileStats [ stat.ST_MODE ] ): #判斷是否路徑
print 'Directory. '
else:
print 'Non-directory.'
if stat.S_ISREG ( fileStats [ stat.ST_MODE ] ): #判斷是否一般檔案
print 'Regular file.'
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.'
#!/usr/bin/env python
#-*- encoding:UTF-8 -*-
import os.path
fileStats = '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.'
stat模組描述了os.stat(filename)返回的檔案屬性列表中各值的意義。我們可方便地根據stat模組存取os.stat()中的值。
5.序列化檔案
代碼如下:
#!/usr/bin/env python
#-*- encoding:UTF-8 -*-
import pickle
filehandler = open('pickle.txt','w')
text = ['this is a pickle demonstrate','aa','bb']
pickle.dump(text,filehandler) #把text的內容序列化後儲存到pickle.txt檔案中
filehandler.close()
filehandler2 = open('pickle.txt')
textlist = pickle.load(filehandler2) #還原序列化字串
print textlist
filehandler2.close()
#cpickle是用C寫的pickle模組,比標準的pickle速度快很多,使用方法同pickle。
6.記憶體檔案
代碼如下:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import StringIO
fileHandle = StringIO.StringIO ( "Let freedom ring." ) #create file in memory
print fileHandle.read() # "Let freedom ring."
fileHandle.close()
#cStringIO是用C寫的StringIO模組,執行速度比StringIO快。
shutil模組是一個進階的檔案處理模組,可實現檔案的拷貝、刪除等操作。
開啟檔案
開啟檔案程式會調用內建的open函數,首先是外部名,接著就是處理模式。
常見的檔案運算:
在任何情況下,Python程式中的文字檔採用字串的形式,讀取文本時會返回字串形式的文本
從檔案中讀取的資料回到指令碼時是一個字串,所以如果字串不是你所需的,就得將其轉換成其他類型的Python對象
實際應用中的檔案
首先看一個檔案處理的一個簡單的例子:
代碼如下:
>>> myfile=open('myfile','w')
>>> myfile.write('hello,myfile!\n')
>>> myfile.close()
>>> myfile=open('myfile')
>>> myfile.readline()
'hello,myfile!\n'
>>> myfile.readline()
''
把一行文本寫成字串,包含行終止符\n,寫入方法不會為我們添加行終止符
在檔案中儲存並解析Python對象
必須使用轉換工具把對象轉換成字串,注意檔案資料在指令碼中一定是字串,而寫入方法不會自動地替我們做任何向字串格式轉換的工作
代碼如下:
>>> X,Y,Z=43,324,34
>>> S='Spam'
>>> D={'a':1,'b':2}
>>> L=[1,2,3]
>>> F=open('datafile.txt','w')
>>> F.write(S+'\n')
>>> F.write('%s,%s,%s\n'%(X,Y,Z))
>>> F.write(str(L)+'$'+str(D)+'\n')
>>> F.close()
一旦我們建立了檔案愛你就可以通過開啟和讀取字串來查看檔案的內容,而print語句則會解釋內嵌行終止符來給使用者滿意的結果:
代碼如下:
>>> bytes=open('datafile.txt').read()
>>> bytes
"Spam\n43,324,34\n[1, 2, 3]${'a': 1, 'b': 2}\n"
>>> print bytes
Spam
43,324,34
[1, 2, 3]${'a': 1, 'b': 2}
鑒於Python不會自動把字串轉換為數字或其他類型的對象,需要使用諸如索引、加法等普通對象工具
代碼如下:
>>> F=open('datafile.txt')
>>> line=F.readline()
>>> line
'Spam\n'
>>> line=F.readline()
>>> line
'43,324,34\n'
>>> parts=line.split(',')
>>> parts
['43', '324', '34\n']
>>> int(parts[1])
324
>>> numbers=[int(p) for p in parts]
>>> numbers
[43, 324, 34]
>>> line=F.readline()
>>> line
"[1, 2, 3]${'a': 1, 'b': 2}\n"
>>> parts=line.split('$')
>>> parts
['[1, 2, 3]', "{'a': 1, 'b': 2}\n"]
>>> eval(parts[0])
[1, 2, 3]
>>> objects=[eval(p) for p in parts]
>>> objects
[[1, 2, 3], {'a': 1, 'b': 2}]
用pickle儲存Python的原生對象
使用eval可以把字串轉換成對象,pickle模組是能夠讓我們直接在檔案中儲存幾乎任何Python對象的進階工具,並不要求把字串轉換來轉換去
代碼如下:
>>> F=open('datafile.txt','w')
>>> import pickle
>>> pickle.dump(D,F)
>>> F.close()
>>> F=open('datafile.txt')
>>> E=pickle.load(F)
>>> E
{'a': 1, 'b': 2}
pickle模組執行所謂的對象序列化,也就是對象和位元組字串之間的互相轉換