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