檔案隻是連續的位元組序列。資料的傳輸經常會用到位元組流,無論位元組流是由單個位元組還是大塊資料組成。
在python中,讀寫檔案有3個步驟:
1、調用open()函數,傳回一個file對象
2、調用file對象的read()和write()方法
3、調用file對象的close()方法,關閉該檔案
檔案内建函數open()和file()
file_object=open(file_name,access_mode='r',buffering=-1)
通常,檔案使用模式‘r’,‘w’,或是‘a’模式來打開,分别代表讀取,寫入和追加。還有個‘U’模式,代表通用換行符支援。
使用‘r’和‘U’模式打開的檔案必須是已經存在的。使用‘w’模式打開的檔案若存在則首先清空,然後重新建立。以‘a’模式打開的檔案是為追加資料作準備的,所有寫入的資料都将追加到檔案的末尾。如果檔案不存在,将被自動建立,類似以‘w’模式打開檔案。此外,‘+’代表可讀可寫,‘b’代表二進制模式通路。
可選參數buffering用于訓示通路檔案所采用的緩沖方式。其中0表示不緩沖,1表示隻緩沖一行資料,任何其他大于1的值代表使用給定值作為緩沖區大小。不提供該參數或給定負值代表使用系統預設緩沖機制,即對任何類電報機(tty)裝置使用行緩沖,其他裝置使用正常緩沖。
open()和file()函數具有相同的功能,可以任意替換。一般來說,建議使用open()讀寫檔案,在想要說明正在處理的是檔案對象時使用file()
不同平台用來表示行結束的符号是不同的。當使用‘U’标志打開檔案的時候,所有的行分隔符通過python的輸入方法傳回時都會被替換為換行符NEWLINE(\n)。檔案對象的newlines屬性會記錄它曾看到的檔案的行結束符。
當檔案剛被打開,程式還沒有遇到行結束符,那麼檔案的newlines為None。在第一行被讀取後,它被設定為第一行的結束符。如果遇到其他類型的行結束符,檔案的newlines會成為一個包含每種格式的元組。注意UNS(通用換行符支援)隻用于讀取文本檔案。沒有對應的處理檔案輸出的方法。
在編譯python的時候,UNS預設是打開的。如果不需要這個特性,在運作configure腳本時,可以使用--without-universal-newlines開關關閉它。
檔案内建方法
open()成功執行後,檔案的方法可分為四類:輸入、輸出、檔案内移動及雜項操作。
read()方法用來直接讀取位元組到字元串中。預設檔案将被讀取直至末尾。
readline()方法讀取打開檔案的一行,包括行結束符,作為字元串傳回。
readlines()方法讀取所有剩餘的行然後把它們作為一個字元串清單傳回。
write()方法把含有文本資料或二進制資料塊的字元串寫入檔案中去。
writelines()方法接收一個字元串清單作為參數,将它們寫入檔案。行結束符并不會被自動加入。
當使用read()或readline()從檔案中讀取行時,python并不會删除行結束符,這個操作留給了程式員:
f=open('myfile','r')
data=[line.strip() for line in f.readlines()]
f.close()
類似地,write()或writelines()也不會自動加入行結束符,需要在像檔案寫入資料前完成。
seek()方法可以在檔案中移動檔案指針到不同的位置。offset位元組代表相對位置的偏移量。預設為0,代表從檔案開頭算起,1代表從目前位置算起,2代表從檔案末尾算起。
test()是對seek()的補充,它告訴你目前檔案指針在檔案中的位置,從檔案起始算起,機關為位元組。
一行一行通路檔案很簡單:
for eachLine in f:
:
close()方法關閉檔案結束對它的通路。如果不顯式地關閉檔案,那麼可能會丢失緩沖區的資料。
fileno()方法傳回打開檔案的描述符。
flush()方法會直接把内部緩沖區中的資料立刻寫入檔案,而不是被動地等待輸出緩沖區被寫入。
isatty()是個布爾内建函數,當檔案是個類tty裝置時傳回True,否則傳回False。
truncate()方法将檔案截取到目前檔案指針位置或者到給定size,以位元組為機關。
使用檔案疊代器,每次隻讀取和顯示一行:
filename=raw_input('enter file name:')
f=open(filename,'r')
print eachLine,
注意:print語句預設在輸出内容末尾後加一個換行符,而在語句後加一個逗号就可以避免這個行為。如果省略逗号,顯示的文本每行後會有兩個換行符,一個是輸入附帶的,另一個是print自動添加的。
作業系統間的差異之一是它們所支援的行分隔符不同。但python設計者已經考慮到了這個問題。是以,不管使用什麼平台,隻要導入了os子產品,這些變量會自動被設定為正确的值,減少了開發者的麻煩。
filename=raw_input('Enter file name:')
fobj=open(filename,'w')
while True:
aLine=raw_input('Enter a line('.'to quit):')
if aLine!='.':
fobj.write('%s%s' %(aLine,os.linesep))
else:
break
fobj.close()
由于raw_put()不會保留使用者輸入的換行符,調用write()方法時必須加上換行符。
file.next() 傳回檔案的下一行。沒有其他行時将會引發stopiteration異常。
file.closed表示檔案已經被關閉,否則為False。
标準檔案
一般來說,隻要你的程式一執行,你就可以通路3個标準檔案。它們分别是标準輸入、标準輸出和标準錯誤。這些檔案分别為stdin,stdout和stderr,它們已經預先被打開了,可以随時通路這些檔案。
python中可以通過sys子產品來通路這些檔案的句柄。導入sys子產品後,就可以使用sys.stdin、sys.stdout和sys.stderr通路。print語句通常輸出到sys.stdout。而内建raw_input()則通常從sys.stdin接收輸入。
記住,sys.*是檔案,是以必須要處理好換行符。而print語句會自動在要輸出的字元串後加上換行符。
指令行參數
sys.argv是指令行參數的清單
len(sys.argv)是指令行參數的個數(也就是argc)
各個程式的輸出一般是不儲存的,這樣可以節省大量的磁盤空間,各個程式的輸出通常使用“管道”實作到下個程式輸入的轉換。
python還提供兩個子產品來輔助處理指令行參數。其中一個是getopt子產品,比較簡單,不是很精細。另一個是optparse子產品,它面向對象,也更複雜。
檔案系統
對檔案系統的通路大多通過python的os子產品實作。os子產品實際上隻是真正加載的子產品的前端。隻要導入os子產品,python會自動選擇正确的底層子產品。根據系統支援的特性,可能無法通路到一些在其他系統上可用的屬性。
除了對程序和程序運作環境進行管理外,os子產品還負責處理大部分的檔案系統操作。這些功能包括删除/重命名檔案,周遊目錄樹,以及管理檔案通路權限等。
os.path可以完成一些針對路徑名的操作。它提供的函數可以完成管理和操作檔案路徑名中的各個部分,擷取檔案或子目錄資訊,檔案路徑查詢等操作。
永久存儲子產品
python提供了許多可以實作最小化永久性存儲的子產品。其中marshal和pickle可以用來轉換并存儲python對象。該過程将比基本類型複雜的對象轉換為一個二進制資料集合,這樣就可以把資料集合儲存起來或通過網絡發送,然後再重新把資料集合恢複原來的對象格式。
marshal隻能處理簡單的python對象,而pickle還可以處理遞歸對象,被不同地方多次引用的對象,以及使用者定義的類和執行個體。
pickle子產品回建立一個python語言專用的二進制格式,你不需要考慮任何檔案細節,它會幹淨利索地完成讀寫對象操作。pickle子產品中的兩個主要函數是dump()和load()。dump()函數把資料對象以特定格式儲存到給定檔案裡。load()函數從檔案中取出已儲存的對象。
在使用*db*系列的子產品時,如果不确定的話,最好使用anydbm子產品,會自動檢測系統上已安裝的DBM相容子產品,并選擇‘最好’的一個。
dumbdbm子產品是功能最少的一個,在沒有其他子產品可用時,anydbm才會選擇。不足之處是隻能存儲字元串,不能堆python對象進行序列化。
shelve子產品允許對資料庫檔案進行并發的讀通路,但不允許共享讀/寫通路。這是在python标準庫裡最接近永久性儲存的東西了。不必用讀模式或者寫模式打開,因為它們打開後,既能讀又能寫。
本文轉自Grodd51CTO部落格,原文連結:http://blog.51cto.com/juispan/1960328,如需轉載請自行聯系原作者