1. 程式人生 > >第三篇:python3的檔案讀寫操作

第三篇:python3的檔案讀寫操作

簡介

檔案的讀寫操作幾乎是每門語言都有的基礎。python的檔案操作過程可以分成以下三步:

  1. open()函式開啟一個檔案(沒有則新建),獲得檔案操作符
  2. 通過檔案控制代碼對檔案進行操作
  3. 完成檔案操作,用close()函式關閉檔案控制代碼

下面就按這三步來,簡單總結一下。

open()開啟一個檔案

在對檔案進行操作時,我們首先是使用open()函式來開啟一個檔案,從而獲得它的檔案操作符(也有稱檔案控制代碼),不論是讀操作還是寫操作,都是使用open()
那麼,怎麼使用open()呢?
我們來看看open()的幾個關鍵的引數.

open(‘test.txt’,’mode’,encoding=’xxx’)

上式中,第一個引數是檔案的路徑名;第三個引數的xxx那裡是填入適當的編碼格式,加入你的檔案是gbk格式的,你開啟的時候,為了防止出現亂碼,你就得告訴函式,需要用什麼格式開啟。
至於第二個引數mode,有許多個值可以填的,可以根據需求填值:

mode 說明
r 以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。
rb 以二進位制格式開啟一個檔案用於只讀。檔案指標將會放在檔案的開頭。這是預設模式。
r+ 開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。
rb+ 以二進位制格式開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。
w 開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。
wb 以二進位制格式開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。
w+ 開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。
wb+ 以二進位制格式開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。
a 開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。
ab 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。
a+ 開啟一個檔案用於讀寫。如果該檔案已存在,檔案指標將會放在檔案的結尾。檔案開啟時會是追加模式。如果該檔案不存在,建立新檔案用於讀寫。
ab+ 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果該檔案不存在,建立新檔案用於讀寫。

檔案操作

我們通過open()函式獲得檔案操作符後就可以對檔案進行讀操作(mode=’r’),或者寫操作了(mode=’w’)

讀操作

#!/usr/bin/env python3
f = open('fileTest.txt', 'r')
f = f.read()
print(f)

read()一次性讀取檔案的全部內容,可以在read(size)裡面傳參,表示每次讀取size個位元組的內容。

readline() 每次讀取檔案一行的內容。
readlines()一次讀取所有內容並按行返回 list。

寫操作

只有呼叫close()方法時,作業系統才能保證把沒有寫入的資料全部寫入磁碟:

#!/usr/bin/env python3
# _*_coding:UTF-8_*_
# 寫操作
f = open('fileTest2.txt','w')
f.write('hello! It`s me!')
f.close()

對於要寫入特定編碼的文字檔案,可以給open() 的encoding傳參:

#!/usr/bin/env python3
# _*_coding:UTF-8_*_
# 寫操作
f = open('fileTest2.txt','w',encoding='gbk')
f.write('hello! It`s me!')
f.close()

write()是檔案寫操作中一個比較簡單的操作,它將字串寫入檔案,沒有返回值。除了這個write()還有writelines()函式,這個函式是向檔案寫入一個序列字串列表,換行需要位元組新增換行符:

#!/usr/bin/env python3
# _*_coding:UTF-8_*_
# writelines()
str = ['你好,','歡迎!\n','這裡是ZER021的部落格.']
f = open('fileTest2.txt','w',encoding='utf-8')
f.writelines(str)
f.close()

'''
這是執行結果:
你好,歡迎!
這裡是ZER021的部落格.
'''

檔案其他操作函式

seek():指定檔案指標的位置,seek(0)把指標移動到檔案開頭處;
tell():獲取檔案指標的位置;

#!/usr/bin/env python3
# _*_coding:UTF-8_*_
f = open('fileTest.txt','r',encoding='utf-8')
#讀取一行
data = f.readline()
# 檢視指標位置
print(data.strip())
print('輸出一行後的檔案指標在:',f.tell())
f.seek(0)
print('用seek()將檔案指標放回開始處:',f.tell())
print('再次輸出:',f.readline())
f.close()

這是執行結果:
python檔案

truncate():截斷檔案資料,返回保留指定之前的資料,不能用ww+模式開啟;

with open('fileTest2.txt','r+',encoding='utf-8') as f:
    # 截斷5個字元後,讀取檔案
    f.truncate(5)
    print('呼叫truncate(5)之後的輸出:', f.read())

flush():重新整理檔案內部緩衝區,下面是利用flush()重新整理可以建立一個單行顯示動態的進度條。

#!/usr/bin/env python3
# _*_coding:UTF-8_*_
import sys,time
for i in range(50):
    sys.stdout.write("#")
    sys.stdout.flush()
    time.sleep(0.1)

fileno():獲取檔案描述符

f = open('fileTest.txt','r',encoding='utf-8')
print(f.fileno())

isatty():測試是否是一個終端裝置檔案
next()返回檔案下一行;以下是返回10行的程式碼:

f = open('fileTest.txt','r',encoding='utf-8')
for  i in range(10):
    print(f.__next__().strip())
f.close()

不可描述

encoding():顯示檔案編碼:

f = open('fileTest.txt','r',encoding='utf-8')
print(f.encoding)

replace()可用於檔案的修改:

f = open('fileTest.txt','r',encoding='utf-8')
for i in f.readlines():
    if '凌霄花' in i:
        i = i.replace('凌霄花','很多很多凌霄花')
    print(i.strip())
f.close()

執行結果:
python

關閉檔案操作

我們結束檔案操作後,需要呼叫close()為關閉檔案操作符,以免佔有記憶體資源。當然,python為我們提供了更便捷的語句,幫助我們關閉,那就with。上面的程式碼,修改成下面這個也是行得通的,而且也不用在寫close()函式:

with open('fileTest.txt','r',encoding='utf-8') as f:
    for i in f.readlines():
        if '凌霄花' in i:
            i = i.replace('凌霄花','很多很多凌霄花')
        print(i.strip())