open函數理解
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
mode模式
合法mode:r、rb、r+、rb+、w、wb、w+、wb+、a、ab、a+、ab+
========= ===============================================================
Character Meaning
--------- ---------------------------------------------------------------
'r' open for reading (default) 讀取: 默認打開文件用於讀取
'w' open for writing, truncating the file first 寫入:打開文件用於寫入,如果文件不存在則創建文件,如果文件存在,則后寫入內容覆蓋之前內容
'x' create a new file and open it for writing 寫入:創建一個新文件,並且打開寫入內容(打開文件以進行獨占創建。如果文件已經存在,則操作失敗。)
'a' open for writing, appending to the end of the file if it exists 寫入:append ,在已存在的文件后再添加內容,如果不存在,則創建一個新文件
'b' binary mode 文件格式:二進制文件
't' text mode (default) 文件格式:文本文件(默認格式)
'+' open a disk file for updating (reading and writing) 混合:打開文件進行讀寫更新
'U' universal newline mode (deprecated)
========= ===============================================================
w用法
#沒有文件新建寫入文件
In [1]: with open('train1','wt')as f: ...: f.write('today is monday')
#文件存在,再次寫入內容,覆蓋原來內容寫入
In [2]: with open('train1','wt')as f:...: f.write('today is tuesday')

X用法
特點在新,文件存在則不能創建,那么也就沒有內容覆蓋這一說法
#train1存在;xt寫入不成功
In [3]: with open('train1','xt')as f: ...: f.write('today is friday') ...: --------------------------------------------------------------------------- FileExistsError Traceback (most recent call last) <ipython-input-3-26ed44691e4d> in <module> ----> 1 with open('train1','xt')as f: 2 f.write('today is friday') 3 FileExistsError: [Errno 17] File exists: 'train1'
使用os.path.exist('filename')做判斷,由此判斷‘w’能否寫入
a用法
#append:附加在文件末尾
In [4]: with open('train1','at')as f: ...: f.write('這里我們寫入a模式')
#文件不存在,則創建文件:
In [5]: with open('train2','at') as f:
...: f.write('文件不存在a模式寫入文件')

+用法
+的用法 | 文件存在是否存在 | 讀取寫入內容時 |
r+ | 不存在時報錯 | 寫入時內容添加在原內容后 |
w+ | 不存在時創建文件 | 寫入時內容覆蓋原內容 |
a+ | 不存在時創建文件 | 寫入時內容添加在原內容后 |
r+用法
1.讀取內容,寫入時,添加在原內容之后
2.文件不存在報錯
In [25]: f=open('train3','r+') In [26]: f.read() Out[26]: '古潼京七星魯王宮' In [27]: f.write('秦嶺神樹') Out[27]: 4 In [28]: f.seek(0) Out[28]: 0 In [29]: f.read() Out[29]: '古潼京七星魯王宮秦嶺神樹'
In [30]: f=open('train4','r+')
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-30-94bce8ea3946> in <module>
----> 1 f=open('train4','r+')
FileNotFoundError: [Errno 2] No such file or directory: 'train4'
a+用法
1.讀取內容,寫入時,添加在原內容之后
2.文件不存在,新建文件
#文件不存在會新建內容
In [33]: f=open('train4','a+') In [34]: f.write('雲頂天宮') Out[34]: 4 In [35]: f.read() Out[35]: '' In [36]: f.seek(0) Out[36]: 0 In [37]: f.read() Out[37]: '雲頂天宮' In [38]: f.close()
#文件存在時,寫入文件,a+會把內容append在后
In [43]: f.write('張家古樓')
out[43]: 4
In [44]: f.seek(0)
Out[44]: 0
In [45]: f.read()
Out[45]: '雲頂天宮張家古樓'
w+用法
1.讀取內容,寫入時,覆蓋內容
2.文件不存在,新建文件
#文件不存在時新建文件
In [48]: f=open('train5','w+') In [49]: f.write('陰山古樓') Out[49]: 4 In [50]: f.seek(0) Out[50]: 0 In [51]: f.read() Out[51]: '陰山古樓' In [52]: f.close()
#文件存在,寫入時覆蓋原內容
In [53]: f=open('train5','w+')
In [54]: f.write('塔木坨')
Out[54]: 3
In [55]: f.seek()
In [56]: f.seek(0)
Out[56]: 0
In [57]: f.read()
Out[57]: '塔木坨'
seek的函數
由於+應用中會使用讀寫操作會涉及指針偏移,為便利讀取,故需設定指針位置,需應用seek函數
seek(offset[, whence]) ,offset是相對於某個位置的偏移量。位置由whence決定,默認whence=0,從開頭起;whence=1,從當前位置算起;whence=2相對於文件末尾移動,通常offset取負值。
close()關閉
當我們寫文件時,操作系統往往不會立刻把數據寫入磁盤,而是放到內存緩存起來,空閑的時候再慢慢寫入。只有調用close()方法時,操作系統才保證把沒有寫入的數據全部寫入磁盤。忘記調用close()的后果是數據可能只寫了一部分到磁盤,剩下的丟失了。
這種方法並不完全安全。如果對文件執行某些操作時發生異常,則代碼將退出而不關閉文件。
一種更安全的方法是使用try ... finally塊
try: f = open("test.txt", encoding = 'utf-8') # perform file operations finally: f.close()
這樣,即使出現引發導致程序流停止的異常,我們也可以保證文件已正確關閉。
關閉文件的最佳方法是使用with
語句。這樣可以確保在with
退出語句內的塊時關閉文件。
我們不需要顯式調用該close()
方法。它是在內部完成的。
with open("test.txt", encoding = 'utf-8') as f: # perform file operations