1. 程式人生 > >【python】open函式檔案操作讀、寫和轉義符‘\n’

【python】open函式檔案操作讀、寫和轉義符‘\n’

1、open()語法

open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]])

open函式使用一個檔名作為唯一的強制引數,然後返回唯一的檔案物件。

open:函式有很多的引數,常用的是file,mode和encoding
file:檔案位置,需要加引號;
mode檔案開啟模式,有讀、寫;
buffering的可取值有0,1,>1三個,0代表buffer關閉(只適用於二進位制模式),1代表line buffer(只適用於文字模式),>1表示初始化的buffer大小;
encoding

表示的是返回的資料採用何種編碼,一般採用utf8或者gbk;
errors的取值一般有strict,ignore,當取strict的時候,字元編碼出現問題的時候,會報錯,當取ignore的時候,編碼出現問題,程式會忽略而過,繼續執行下面的程式。
newline可以取的值有None, \n, \r, ”, ‘\r\n’用於區分換行符,但是這個引數只對文字模式有效;

2、 Python中file()與open()區別

兩者都能夠開啟檔案,對檔案進行操作,也具有相似的用法和引數,但是,這兩種檔案開啟方式有本質的區別,file為檔案類,用file()來開啟檔案,相當於這是在構造檔案類,而用open()開啟檔案,是用python的內建函式來操作

,建議使用open;

3、檔案開啟—轉義符的使用

複製檔案的路徑,開啟檔案:

In [1]: open('C:\Users\BruceWong\Documents\out.log')
  File "<ipython-input-7-6f95fbc44d0c>", line 1
    open('C:\Users\BruceWong\Documents\out.log')
        ^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

出現開啟錯誤,直接複製路徑開啟報錯,是因為”\”符號在python中會被視為轉義符,此時傳入的路徑就出現差錯;那我們可以採取修改路徑的方式,將”\”改為”/”:

In [8]: open('C:/Users/BruceWong/Documents/out.log')   #將"\"改為"/"使得路徑能正確識別
Out[8]: <_io.TextIOWrapper name='C:/Users/BruceWong/Documents/out.log' mode='r' encoding='cp936'>

或者使用最常規的操作:在含有轉義符的字串前加‘r’表示字串內按原始含義解釋,不做轉義處理;這裡的r相當於正則表達的操作;

In [2]: open(r'C:\Users\BruceWong\Documents\out.log')
Out[2]: <_io.TextIOWrapper name='C:\\Users\\BruceWong\\Documents\\out.log' mode='r' encoding='cp936'>  #open函式預設的開啟檔案的模式是隻讀。

另附

4、引數mode檔案開啟模式的基本取值

常見的開啟模式如圖:
這裡寫圖片描述

常見的mode取值組合:

  • r或rt 預設模式,文字模式讀
  • rb 二進位制檔案
  • w或wt 文字模式寫,開啟前檔案儲存被清空
  • wb 二進位制寫,檔案儲存同樣被清空
  • a 追加模式,只能寫在檔案末尾
  • a+ 可讀寫模式,寫只能寫在檔案末尾
  • w+ 可讀寫,與a+的區別是要清空檔案內容
  • r+ 可讀寫,與a+的區別是可以寫到檔案任何位置

r:開啟檔案只讀模式,檢視檔案內容

#開啟檔案只讀模式,檢視檔案內容
In [1]: art = open(r'C:\Users\BruceWong\Documents\out.log')
In [2]: art.readlines()
Out[2]: ['Hello,Python\n', 'IM Bruce\n', 'This is a test file\n']

w:開啟寫入write模式,重新寫入的內容會替代原內容

#開啟寫入write模式,重新寫入的內容會替代原內容
In [3]: art1 = open(r'C:\Users\BruceWong\Documents\out.log','w')
#寫入新的內容,返回內容的長度
In [4]: art1.write('doing best')
Out[4]: 10
#當重新寫入後不能呼叫readlines來讀取,必須先宣告檔案為讀取的模式才行
In [5]: art1.readlines()
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-5-404b009bb145> in <module>()
----> 1 art1.readlines()
UnsupportedOperation: not readable
#對檔案操作後,要關閉檔案
In [6]: art1.close()
#檢視art1
In [7]: art1
Out[7]: <_io.TextIOWrapper name='C:\\Users\\BruceWong\\Documents\\out.log' mode='w' encoding='cp936'>
#開啟檔案可讀模式讀取檔案
In [8]: art1 = open(r'C:\Users\BruceWong\Documents\out.log','r')
#讀取檔案的每一條
In [9]: art1.readlines()
Out[9]: ['doing best']
In [10]: art1.close()
#再次對檔案進行寫模式下的操作
In [11]: art1 = open(r'C:\Users\BruceWong\Documents\out.log','w')
#write函式只能呼叫一個引數
In [12]: art1.write('aaa','bbb')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-f3c3691c1587> in <module>()
----> 1 art1.write('aaa','bbb')
TypeError: write() takes exactly one argument (2 given)
#writelines也只能呼叫一個引數
In [13]: art1.writelines('aaa','bbb')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-f44e5da5c42a> in <module>()
----> 1 art1.writelines('aaa','bbb')
TypeError: writelines() takes exactly one argument (2 given)
#如果想寫入多行,需要將寫入的檔案採用換行符的操作即可
In [14]: art1.write('aaa\nbbb')
Out[14]: 7
In [15]: art1.close()

In [16]: art1 = open(r'C:\Users\BruceWong\Documents\out.log','r')  #檢視新的檔案的內容
In [17]: art1.readlines()
Out[17]: ['aaa\n', 'bbb']
In [18]: art1.close()

#亦可以通過迭代的方式:
In [24]: test = [ "test1\n", "test2\n", "test3\n" ]
    ...: f = open(r'C:\Users\BruceWong\Documents\out.log','w')
    ...: for i in test:
    ...:     f.write(i)
    ...: f.close()
In [30]: f = open(r'C:\Users\BruceWong\Documents\out.log','r')
In [31]: f.readlines()
Out[31]: ['test1\n', 'test2\n', 'test3\n']

a:開啟新增模式,但是新增的內容在文尾

#新增一個或者使用換行符新增多個
In [19]: art1 = open(r'C:\Users\BruceWong\Documents\out.log','a')
In [20]: art1.write('rrr')
Out[20]: 3
In [21]: art1.close()
In [22]: art1 = open(r'C:\Users\BruceWong\Documents\out.log','r')
In [23]: art1.readlines()
Out[23]: ['aaa\n', 'bbbrrr']
#迭代新增多個
In [33]: test = [ "test1\n", "test2\n", "test3\n" ]
    ...: f = open(r'C:\Users\BruceWong\Documents\out.log','a')
    ...: for i in test:
    ...:     f.write(i)
    ...: f.close()
    ...:
#檢視新增結果
In [34]: f = open(r'C:\Users\BruceWong\Documents\out.log','r')
In [35]: f.readlines()
Out[35]: ['test1\n', 'test2\n', 'test3\n', 'test1\n', 'test2\n', 'test3\n']
In [36]: f.close()

r+:在寫入檔案前,我們在上面那段程式碼中加上一句f.seek(0),用來定位寫入檔案寫入位置(檔案開頭),直接覆蓋字元數(注意\n也是一個字元)

  • f.seek(n)將在n位置寫入
In [37]: test = [ "book\n", "joke2\n", "fang3\n" ]
    ...: f = open(r'C:\Users\BruceWong\Documents\out.log','r+')
    ...: for i in test:
    ...:     f.seek(0)
    ...:     f.write(i)
    ...: f.close()
In [38]: f = open(r'C:\Users\BruceWong\Documents\out.log','r')
#由於迭代時,每次都會判斷初始位置並將第一個元素重新寫入
In [39]: f.readlines()
Out[39]: ['fang3\n', 'test2\n', 'test3\n', 'test1\n', 'test2\n', 'test3\n']
In [40]: f.close()

#將test所有的元素新增到開頭
In [41]: test = [ "book\n", "joke2\n", "fang3\n" ]
    ...: f = open(r'C:\Users\BruceWong\Documents\out.log','r+')
    ...: f.seek(0)
    ...: for i in test:
    ...:     f.write(i)
    ...: f.close()
In [42]: f = open(r'C:\Users\BruceWong\Documents\out.log','r')
In [43]: f.readlines()
Out[43]: ['book\n', 'joke2\n', 'fang3\n', '\n', 'test1\n', 'test2\n', 'test3\n']
In [44]: f.close()

5、其他測試
f.read()讀取整個檔案

In [45]: f = open(r'C:\Users\BruceWong\Documents\out.log','r')
#讀取整個檔案,字串顯示
In [46]: f.read()
Out[46]: 'book\njoke2\nfang3\n\ntest1\ntest2\ntest3\n'
#指標在檔案末尾,不能再讀取內容
In [47]: f.read()
Out[47]: ''

f.readline()讀取一條一條的資訊

In [49]: f = open(r'C:\Users\BruceWong\Documents\out.log','r')
In [50]: f.readline()
Out[50]: 'book\n'
In [51]: f.readline()
Out[51]: 'joke2\n'
In [52]: f.readline()
Out[52]: 'fang3\n'
In [53]: f.close()

f.readlines()讀取所有的資訊,返回元素列表

In [54]: f = open(r'C:\Users\BruceWong\Documents\out.log','r')
In [55]: f.readlines()
Out[55]: ['book\n', 'joke2\n', 'fang3\n', '\n', 'test1\n', 'test2\n', 'test3\n']
In [56]: f.close()