首頁  >  文章  >  後端開發  >  python中文件操作的相關內容總結(附範例)

python中文件操作的相關內容總結(附範例)

不言
不言轉載
2018-10-29 17:37:072569瀏覽

這篇文章帶給大家的內容是關於python中文件操作的相關內容總結(附範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

1. 文件操作介紹

說到操作文件我們一定會想到流,文件的操作都是透過流來操作的。在python中文件的操作非常簡單,並不像Java等其他語言一樣有各種各樣的流操作,我們直接使用open函數即可打開一個文件,然後進行各種操作,但是根據打開的不同的方式所能夠執行的操作也不一樣,開啟檔案的方式有:r, w, a, r , w , a , rb, wb, ab, r b, w b, a b 等。

下面我們先看一個讀取的文件操作:

In [2]: f = open(file='a.txt', mode='r', encoding='utf-8')

In [3]: f.read()
Out[3]: '每天坚持一点,\n每天努力一点,\n每天多思考一点,\n慢慢你会发现,\n你的进步越来越大\n'
In [4]:

使用open函數開啟文件,並且傳回一個文件對象,open函數常見的幾個參數file(要操作的檔名),mode(以什麼模式開啟)和encoding(指定一種編碼來讀取檔案),根據不同的mode模式,傳回的檔案會有各種不同的操作。下面我們來看看文件的幾種操作。

2. 檔案操作的幾種方式

(1)只讀操作

只讀操作只需指定mode為r:

In [5]: f = open(file='a.txt', mode='r', encoding='utf-8')
 
In [6]: f.read()
Out[6]: '每天坚持一点,\n每天努力一点,\n每天多思考一点,\n慢慢你会发现,\n你的进步越来越大\n'
 
In [7]: f.readable()                # 判断文件是否可读
Out[7]: True
 
In [8]: f.writable()                # 判断文件是否可写
Out[8]: False                       # 此处是以只读模式打开的文件,所以返回False不可写
 
In [9]: f1 = open(file='单分支结构.eddx', mode='rb')        # 使用‘rb’可以打开存储为二进制的数据,图片、视频等
 
In [10]: f1.read(20)
Out[10]: b'PK\x03\x04\x14\x00\x08\x00\x08\x00mN\xe3H\xa9\x95\xb3\x9eW\x01'

(2)只寫操作

mode='w'

                                                                             
In [13]: f = open(file='a.txt', mode='w', encoding='utf-8')                  
                                                                             
In [14]: f.read()                       # 此时尝试读取文件会报错                                            
---------------------------------------------------------------------------  
UnsupportedOperation                      Traceback (most recent call last)  
<ipython-input-14-571e9fb02258> in <module>                                  
----> 1 f.read()                                                             
                                                                             
UnsupportedOperation: not readable                                           
                                                                             
In [15]: f.write(&#39;葫芦娃&#39;)                                                      
Out[15]: 3                                                                   
                                                                             
In [16]: f.close()                                                           
                                                                             
In [17]: !cat a.txt                     # 此时查看文件之前那的内容已经被覆盖了                             
葫芦娃                                                                          
In [18]:

使用mode='w'操作文件時首先會在開啟文件時先清空文件,然後再根據操作把內容寫入文件,只讀模式有以下特點:

  • 當文件不存在時,會自動建立文件,然後開啟文件進行動作

  • #開啟檔案時會先清空檔案的內容,然後再從頭開始寫入

  • #檔案以只寫模式打開,不能夠讀取

(3)追加操作

mode='a'

In [18]: f = open(file=&#39;a.txt&#39;, mode=&#39;a&#39;, encoding=&#39;utf-8&#39;)
 
In [19]: f.write(&#39;每天坚持一点,\n每天努力一点,\n每天多思考一点,\n慢慢你会发现,\n你的进步越来越大\n&#39;)
Out[19]: 42
 
In [20]: f.close()
 
In [21]:
 
In [21]: !cat a.txt
葫芦娃每天坚持一点,
每天努力一点,
每天多思考一点,
慢慢你会发现,
你的进步越来越大
 
In [22]:

追加模式的操作:

  • 開啟文件時如果檔案不存時會先建立檔案

  • 往檔案中寫入內容時都是在檔案結尾寫入,不論遊標在哪

  • 開啟的檔案只能寫入,無法讀取

(4)r 模式

r

模式是加強的讀取操作,即可以讀寫:

In [22]: f = open(file=&#39;a.txt&#39;, mode=&#39;r+&#39;, encoding=&#39;utf-8&#39;)

In [23]: f.readable()
Out[23]: True

In [24]: f.writable()
Out[24]: True

In [25]: f.read()
Out[25]: &#39;葫芦娃每天坚持一点,\n每天努力一点,\n每天多思考一点,\n慢慢你会发现,\n你的进步越来越大\n&#39;

In [26]: f.write(&#39;\n哈哈哈哈哈哈哈&#39;)
Out[26]: 8

In [27]: f.close()

In [28]: !cat a.txt         # 查看写入的文件并没有异常
葫芦娃每天坚持一点,
每天努力一点,
每天多思考一点,
慢慢你会发现,
你的进步越来越大

哈哈哈哈哈哈哈
In [29]: f = open(file=&#39;a.txt&#39;, mode=&#39;r+&#39;, encoding=&#39;utf-8&#39;)

In [30]: f.seek(0, 2)       # seek可以调整光标位置
Out[30]: 153

In [31]: f.write(&#39;你的进步越来越大&#39;)
Out[31]: 8

In [32]: f.read()           # 先写后读会读出空字符
Out[32]: &#39;&#39;

In [33]:

總結:增強的讀取操作對檔案可讀可寫,但是順序必須是先讀取在往裡面寫入,如果先讀再寫入再讀取的時候可能會讀取到空字串

r 模式深坑請注意: 在r 模式下. 如果讀取了內容. 不論讀取內容多少. 遊標顯⽰的是多少. 再寫入或操作⽂件的時候都是在結尾進⾏的操作

#(5)w 和a 模式

w 模式和a 模式在實際使用場景較少,這邊簡單介紹一下:
  • w :增強的w模式,可以寫和讀操作,但是也跟r 一樣,如果先讀操作再寫操作的話會有坑出現,每次在開啟文件是會先清空文件,因此使用場景較少
  • a :增強的a模式,也可以進行讀寫操作,但是寫入時只能寫入檔案的末端,無論遊標怎麼移動,都只能在檔案結尾寫入

3.檔案的操作的方法

(1)檔案的讀取和寫入

#檔案的寫入

:主要是write方法以及writelines方法
  • write方法:直接寫入字串即可,上面的例子也有用到
  • writelines方法:傳遞的參數必須時可迭代的(如列表和元組等)

檔案的讀取

  • ##read方法:read方法接收int型的參數,表示一次讀取幾個字元(seek的單位是位元組),不提供預設是讀取檔案所有內容

  • readline方法:讀取檔案一行,文件很大時這個方法很使用,不會一次讀取整個文件

  • readlines方法:讀取出整個文件,以每一行分割存放到一個列表裡並返回這個列表

In [34]: f = open(file=&#39;a.txt&#39;, mode=&#39;r&#39;, encoding=&#39;utf-8&#39;)
# 葫芦娃每天坚持一点,
# 每天努力一点,
# 每天多思考一点,
# 慢慢你会发现,
# 你的进步越来越大
 
# 哈哈哈哈哈哈哈你的进步越来越大
In [35]: f.read(10)                 # 这里时一次读取10个字符
Out[35]: &#39;葫芦娃每天坚持一点,&#39;
 
In [36]: f.readline()
Out[36]: &#39;\n&#39;
 
In [37]: f.readline()               # 每次读取一行
Out[37]: &#39;每天努力一点,\n&#39;
 
In [38]: f.readlines()              # 返回的是一个列表
Out[38]: [&#39;每天多思考一点,\n&#39;, &#39;慢慢你会发现,\n&#39;, &#39;你的进步越来越大\n&#39;, &#39;\n&#39;, &#39;哈哈哈哈哈哈哈你的进步越来越大&#39;]
 
In [39]:

readline(文件句柄)和readlines的區別

文件句柄是一個可迭代對象,在循環遍歷時每遍歷一次取一行,不會在讀取文件時一次全部讀出來

readlines返回的結果是一個列表,會一次把整個文件的內容讀取出來並返回一個列表,在處理大文件時會非常消耗資源

也可以使用循環去遍歷文件句柄,輸出文件中的內容:

In [39]: f.seek(0)
Out[39]: 0

In [40]: for line in f:
    ...:     print(line.strip())
葫芦娃每天坚持一点,
每天努力一点,
每天多思考一点,
慢慢你会发现,
你的进步越来越大

哈哈哈哈哈哈哈你的进步越来越大

In [41]:

(2)文件操作的其他方法

  • close:關閉文件

  • readable:判斷檔案是否可讀取

  • #seek:移動遊標,接收兩個資料第一個參數表示偏移到哪個位置(移動的單位是byte. 所以如果是UTF-8的中⽂部分要是3的倍數),第二個參數表示從那個位置開始偏移(0,代表開頭,1代表當前位置,2代表結尾)

  • seekable:判断当前文件的光标是否可移动

  • tell:返回当前光标所在的位置

  • truncate:截断数据(谨慎操作),默认截断光标后所有字符

  • writable:判断文件是否可写

(3)打开文件的另一种方式

在打开一个文件后,要记得在文件使用结束狗使用close方法关闭文件句柄,但有时在中间进行大量的操作后可能会忘了关闭,下面介绍的这种方法可以不用自己手动关闭文件了,他会在您操作解说后(代码块的语句执行完毕)自动关闭文件句柄,这种方法就是使用context上下文管理,使用with语句实现:

In [43]: with open(&#39;a.txt&#39;, mode=&#39;r&#39;, encoding=&#39;utf-8&#39;) as f:   # 使用with管理上下文,最后退出时会自己执行close动作
    ...:     for line in f:
    ...:         print(line.strip())
葫芦娃每天坚持一点,
每天努力一点,
每天多思考一点,
慢慢你会发现,
你的进步越来越大
哈哈哈哈哈哈哈你的进步越来越大

以上是python中文件操作的相關內容總結(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除