python文件讀寫

1、open函數用來打開文件

open(name[.mode[.buffering]])

只有文件名是需要輸入的強制參數,然後返回一個文件對象,模式默認是讀模式,默認緩衝區是無;

例如:正常打開:

In [2]: f = open('ceshi.txt')                                                                                                                                              

In [3]: 

如果你要打開的文件不存在的話,會報錯如下:

In [3]: f = open('ceshi_jier.txt')                                                                                                                                         
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-3-69dfda19266b> in <module>
----> 1 f = open('ceshi_jier.txt')

FileNotFoundError: [Errno 2] No such file or directory: 'ceshi_jier.txt'

In [4]: 

2、文件模式

功能描述
‘r’ 讀模式
‘w’ 寫模式
‘a’ 追加模式
‘b’ 二進制模式(可以添加到其他模式中使用)

‘+’

讀/寫模式(可以添加到其他模式中使用)

    ‘b’模式一般處理文本文件用不到,一般是處理二進制和媒體文件的時候用到;

3、文件緩衝區

    open函數中第三個可選參數buffering控制着文件的緩衝,如果參數是0,I/O操作就是無緩衝的,直接將數據寫到了硬盤上,如果參數是1,就是有緩衝,先寫到內存,只有使用flush和close函數,纔會將數據寫到硬盤裏;如果參數是1,就表示緩衝區是1字節,任何負數都代表使用默認緩衝區大小,即緩衝爲0;

4、文件讀取

    文件讀取主要是分爲按字節讀取和按行進行讀取,經常用到的方法有read()、reablines()、close()。

    read方法,讀取文件全部信息出來;

In [8]: f = open('ceshi.txt')                                                                                                                                              

In [9]: f.read()                                                                                                                                                           
Out[9]: 'my name is jier!\nhow are you?\n'

In [10]: f.close()

    每次打開文件,一定要記得關閉,因爲文件對象會佔用操作系統資源,影響系統的IO操作;

    由於文件操作可能出現IO異常,一旦出現IO異常的話,後面的close方法就不會執行了,爲了程序的健壯性,我們使用try...finally來實現。

In [11]: try: 
    ...:     f= open('ceshi.txt') 
    ...:     print(f.read()) 
    ...: finally: 
    ...:     if f: 
    ...:         f.close() 
    ...:                                                                                                                                                                   
my name is jier!
how are you?


In [12]: 

    還有另外一種方法可以簡略上面的寫法,那就是with語句來代替try...finally代碼塊和close方法:

In [12]: with open('ceshi.txt', 'r') as jier: 
    ...:     print(jier.read()) 
    ...:                                                                                                                                                                   
my name is jier!
how are you?


In [13]:  

    調用read()可以一次將文件內容讀入內存中,但是如果文件過大的話,就是出現內存不足的問題,一般對於大文件,我們一般使用分段讀取,即read(size)方法,一次最多讀取size個字節。如果文件是文本文件,我們可以調用readline()每次讀取一行內容,調用readlines()一次讀取所有內容並按行返回列表。

    上面的代碼,可以使用readlines實現:

In [13]: with open('ceshi.txt', 'r') as jier: 
    ...:     for line in jier.readlines(): 
    ...:         print(line.strip()) 
    ...:                                                                                                                                                                   
my name is jier!
how are you?

In [14]: 

5、文件寫入

    寫文件和讀文件是一樣的,唯一的區別是在調用open方法時,傳入標識符'w'或者‘wb’表示寫入文本文件或者寫入二進制文件,示例如下:

In [14]: f = open('ceshi.txt', 'w')                                                                                                                                        

In [15]: f.write('ceshi111')                                                                                                                                               
Out[15]: 8

In [16]: f.write('ceshi222')                                                                                                                                               
Out[16]: 8

In [17]: f.close()                                                                                                                                                         

In [18]: with open('ceshi.txt', 'r') as jier: 
    ...:     for line in jier.readlines(): 
    ...:         print(line.strip()) 
    ...:                                                                                                                                                                   
ceshi111ceshi222

In [19]: 

    但是有一個問題,就是說如果是這樣的話,就會把原來文件中的內容給覆蓋了,這個時候我們就可以將open的模式改爲‘a’:

In [31]: f = open('ceshi.txt', 'a')                                                                                                                                        

In [32]: f.write('ceshi3333')                                                                                                                                              
Out[32]: 9

In [33]: f.close()

In [35]: with open('ceshi.txt', 'r') as jier: 
    ...:     for line in jier.readlines(): 
    ...:         print(line) 
    ...:                                                                                                                                                                   
ceshi111ceshi222ceshi3333

In [36]: 

    我們可以反覆調用write()方法寫入文件,最後必須使用close()方法關閉文件。使用write()的方法的時候,操作系統是不會直接寫入文件中的,而是先寫入內存中緩存起來,等到空閒時候再寫入文件中,最後使用close()就可以寫入文件中了,如果中途想寫入文件,執行其他操作的話,也可以使用flush()來刷新,不斷將內存中的緩存寫入文件。

    以上代碼也可以使用with來執行:

In [36]: with open('ceshi.txt', 'a') as jier: 
    ...:     jier.write('/tnihao') 
    ...:     jier.close() 
    ...:                                                                                                                                                                   

In [37]: with open('ceshi.txt', 'r') as jier: 
    ...:     for line in jier.readlines(): 
    ...:         print(line) 
    ...:                                                                                                                                                                   
ceshi111ceshi222ceshi3333/tnihao

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章