3.1文件操作(files)
Python提供了必要的函數和方法進行默認情況下的文件基本操作。你可以用file對象做大部分的文件操作
3.1.1打開文件
3.1.1.1 open()
Python內置了一個打開文件的函數open(),用來打開一個文件,創建一個file對象,然后你就可以對該打開的文件做任何你想做的操作
fp=open(file_name[,access_mode][,buffering]):file_name變量是一個包含了你要訪問的文件路徑及文件名稱的字符串值,access_mode:決定了打開文件的模式,是只讀、寫入、追加等等。這是個非強制參數,默認文件訪問模式為只讀(r);buffering也是一個非強制性參數,如果buffering的值被設置為0,就不會有緩存;如果值為1,訪問文件時會有緩存行;如果值為大於1的整數,表明了這就是寄存區的緩沖大小,如果取負數值,寄存區的緩存大小則為系統默認。
如果以只讀(r)模式打開一個不存在的文件,會報IOError異常,如果是以寫或者追加模式打開一個不存在的文件,默認會創建該文件,如果所在路徑中有目錄不存在,也會報IOError異常
代碼示例:在d盤目錄下打開/創建一個newfile.txt文本文件,並寫入goodmorning,然后關閉文件
>>> fp=open("d:\\newfile.txt","w") #以寫的方式打開文件
>>> fp.write("goodmorning") #寫入內容
>>> fp.close() 關閉文件#
>>>
執行結果:
代碼示例2:將剛剛寫入的文件內容讀取出來
>>> fp=open("d:\\newfile.txt","r") #以只讀的方式打開文件
>>> print fp.readline() #讀出內容
goodmorning
>>> fp.close() #關閉文件
>>>
3.1.1.2 with open(file_name[,access_mode])
with open(file_name[,access_mode]):與open用法基本一致,區別在於用with方法打開文件,會默認關閉文件
>>> with open("d:\\newfile.txt") as fp:
... for line in fp:
... print line
...
goodmorning
3.1.2 文件操作模式
r:只讀,文件的指針會放在文件的開頭,從開頭開始讀取文件內容,這是文件的默認打開方式
w:覆蓋式寫入,如果文件存在,則將文件中的全部內容清空然后寫入,如果文件不存在,創建文件
a:追加式寫入,從文件的末尾開始寫入,如果文件不存在,創建文件
文件對象:一個文件被打開后,你就會得到一個file對象,然后就可以得到有關該文件的各種信息。
>>> fp=open("d:\\newfile.txt","r")
>>> fp.closed #如果文件已經關閉,返回TRUE,否則返回False
False
>>> fp.mode #返回被打開文件的訪問模式
'r'
>>> fp.name #返回文件的名稱
'd:\\newfile.txt'
>>> fp.softspace #末尾是否強制加空格
0
>>> fp.close()
>>> fp.closed
True
>>>
3.1.3 文件常用操作方法
3.1.3.1 fp.read([size])
fp.read([size]):size為讀取的長度,以byte為單位,如果不指定參數,表示一次性讀取全部內容,以字符串形式返回,並且每一行結尾會有一個”\n”符號
>>> fp=open("d:\\newfile.txt","r")
>>> content=fp.read(5)
>>> print content
goodm
>>> fp.close()
>>>
3.1.3.2 fp.readline([size])
fp.readline([size]):只讀取一行,size為讀取的長度,以byte為單位,如果給定了size,有可能返回的只是一行的一部分,如果不指定參數,表示一次性讀取一行,以字符串形式返回,結尾會有一個”\n”符號,讀完一行,文件操作標記移動到下一行的開頭,下次讀取時,從下一行的開頭開始
示例:按行讀取,每讀取一行,都會有一個/n符號
>>> fp=open("d:\\newfile.txt","r")
>>> for i in range(3):
... a=fp.readline()
... print a
...
goodmornin
my name is pangwei
one two three fore five six
>>> fp.close()
>>>
示例:按長度讀取,一行讀完之后/n符號會獨占一行,之后會再換一行
>>> fp=open("d:\\newfile.txt","r")
>>> for i in range(4):
... a=fp.readline(5)
... print a
...
goodm
ornin
my na
>>> fp.close()
>>>
3.1.3.3 fp.readlines([size])
fp.readlines([size]):把文件的每一行作為一個list的元素,是一個結尾有\n的字符串,如果指定了size參數,表示讀取文件指定內容的長度,此時就有可能只能讀取文件的一部分
>>> fp=open("d:\\newfile.txt","r")
>>> a=fp.readlines()
>>> print a
['goodmornin\n', 'my name is pangwei\n', 'one two three fore five six']
>>> for i in a:
... print i
...
goodmornin
my name is pangwei
one two three fore five six
>>>
3.1.3.4 fp.write(str)
fp.write(str):把str寫入到文件中,默認是不加換行符的,換行需要手動加入換行符”\n”.
>>> fp=open("d:\\newfile.txt","w")
>>> fp.write("pangwei is a sunny big boy"+"\n")
>>> fp.close()
>>>
fp.writelines(seq):把序列seq的內容全部寫入到文件中(多行一次性寫入)。不會自動加入換行符;注意:seq中的內容也必須是字符串類型的數據,才能成功寫入文件
>>> seq=["pangwei\n","is\n","a\n","boy\n","測試文件"]
>>> fp=open("d:\\newfile.txt","w")
>>> fp.writelines(seq)
>>> fp.close()
>>>
fp.close():文件對象的close()方法刷新緩沖區里任何還沒有寫入的信息,並關閉該文件。用close關閉文件是一個很好的習慣,文件關閉之后不能再對文件進行操作,但是如果文件不及時關閉,有可能產生句柄泄露,丟失數據
fp.flush():此函數將緩沖區中的內容寫入硬盤
fp.next():返回文件的下一行內容,並將文件操作標記位移動到下一行,把一個文件(flie)用for i in file這樣的循環遍歷語句時,就是調用next()函數來實現。
>>> fp=open("d:\\newfile.txt","r")
>>> fp.next()
'pangwei\n'
>>> fp.next()
'is\n'
>>> fp.close()
>>>
fp.tell():返回文件操作標記的當前位置,以文件開頭為基准點
>>> fp=open("d:\\newfile.txt","r")
>>> fp.tell()
0L
>>> fp.readline()
'pangwei\n'
>>> fp.tell()
9L
>>> fp.readline()
'is\n'
>>> fp.tell()
13L
>>>fp.close()
>>>
fp.seek(offset[,from]):這是一個文件定位函數,該方法改變當前文件的位置。offset變量表示要移動的字節數,from遍歷指定開始移動字節的參考位置。如果from被設置為0(默認值),意味着將文件開頭作為移動字節的參考位置;1表示使用當前位置作為參考位置;2表示使用文件的末尾作為參考位置。注意:如果使用a或者a+的模式打開文件,文件的標記會自動返回到文件末尾
>>> fp=open("d:\\newfile.txt","r")
>>> fp.readline()
'pangwei\n'
>>> fp.seek(0,0)
>>> fp.readline()
'pangwei\n'
>>> fp.readline()
'is\n'
>>> fp.close()
>>>
fp.truncate([size]):把文件裁成規定的大小,默認的是裁到當前文件操作標記的位置,如果size比文件的大小還要大,根據系統的不同可能是不改變文件,也可能是用0把文件補到相應的大小,也可能是以一些隨機的內容加上去。
>>> fp=open("d:\\newfile.txt","r+")
>>> fp.readline() #讀出了文件第一行的內容
'pangwei\n'
>>> fp.truncate() #從當前位置(第二行開頭)開始裁,后邊的內容全部裁掉了
>>> fp.readline() #讀取到后邊的內容為空
''
>>> fp.close()
>>>
3.1.3 linecache模塊
linecache模塊允許從任何文件里得到任何的行,並且使用緩存進行優化,常見的情況是從單個文件讀取多行。
linecache.getlines(file_name):讀出文件中所有的行,輸出為列表格式,每一行作為一個元素,以linenum-1為元素索引位置存儲
代碼示例1:絕對路徑讀取文件內容
>>> import linecache
>>> linecache.getlines("d:\\newfile.txt")
['pangwei\n', '\n', 'pangwei is a boy\n', 'hello world!\n']
代碼示例2:相對路徑讀取文件內容
>>> import linecache
>>> import os
>>> os.chdir("d:\\")
>>> os.getcwd()
'd:\\'
>>> linecache.getlines("newfile.txt")
['pangwei\n', '\n', 'pangwei is a boy\n', 'hello world!\n']
>>>
linecache.getline(file_name,lineno):讀出文件中第lineno行;這個函數不會拋出異常,如果產生錯誤,他將返回’’(換行符將會包含在找到的行里)
>>> import linecache
>>> linecache.getline("newfile.txt",5)
''
>>> linecache.getline("newfile.txt",4)
'hello world!\n'
>>>
linecache.clearcache([file_name]):清除緩存,file_name是一個非強制參數,表示清除指定文件的緩存
linecache.checkcache([file_name]):檢查緩存的有效性,如果在緩存中的文件在硬盤上發生了變化,並且你需要更新版本,是一個非強制參數,不傳遞此參數,將檢查緩存里的所有條目
linecache.updatecache([file_name]):更新緩存,如果file_name文件更新了,使用這個函數可以更新linecache.getlines(file_name)返回的列表,如果出錯,則返回空列表
練習:刪除文件中的空行
#encoding=utf-8
import os
def DelBlankLine(infile,outfile):
infp=open(infile, "r")
outfp=open(outfile, "w")
lines =infp.readlines()
for i in lines:
if i=='\n': #不同操作系統下換行符可能會有不同
print u"此行是空行"
if i.split(): #去除純空格或者其他不可見字符的行
outfp.write(i)
infp.close()
outfp.close()
#print DelBlankLine("d:\\newfile.txt","d:\\newfile1.txt")
3.1.4 cPickle模塊(序列化)
Python提供一個標准的模塊,稱為pickle,cPickle模塊的功能和pickle模塊完全相同,只不過它是用C語言編寫的,因此要快的多(cPickle比pickle快1000倍);使用它可以在一個文件中存儲任何Python對象,比如列表,字典等,之后你又可以把它完整無缺的取出來,這被稱為持久的存儲對象(序列化)
#encoding=utf-8
import cPickle as p
shoplist=["apple","banner","mango"]
fp=open("d:\\python\\shoplist.txt","w")
p.dump(shoplist,fp) #將列表對象dump到文件中
fp.close()
fpout=open("d:\\python\\shoplist.txt","r")
storedlist=p.load(fpout) #從文件中取出之前的列表
print u"從文件中讀取的列表對象:",storedlist