Python(2.7)-文件操作(file)


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提供一個標准的模塊,稱為picklecPickle模塊的功能和pickle模塊完全相同,只不過它是用C語言編寫的,因此要快的多(cPicklepickle1000倍);使用它可以在一個文件中存儲任何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

 


免責聲明!

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



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