文件與io --open中參數mode=''的用法


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

 


免責聲明!

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



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