1. 程式人生 > >Python檔案操作

Python檔案操作

建立和開啟檔案

普通開啟方式

在Python中想要操作檔案需要先建立或者開啟指定的檔案並建立檔案物件,可以通過內建的open()函式實現。

file = open(FileName, mode , buffering)
  • file:被建立的檔案物件
  • FileName:開啟的檔案及路徑
  • mode:可選引數,用於指定開啟檔案的模式(預設開啟模式為r(只讀))
  • buffering:可選引數,用於指定檔案的緩衝模式,值為0表示式不快取,值為1表示快取,如果大於1,則表示緩衝區的大小,預設為快取模式(一般不用管)。

mode引數的各種對應模式及說明

開啟模式 說明 注意
r 以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。 檔案必須存在
rb 以二進位制格式開啟一個檔案用於只讀。檔案指標將會放在檔案的開頭。這是預設模式。 檔案必須存在
r+ 開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。 檔案必須存在
rb+ 以二進位制格式開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。 檔案必須存在
w 開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 檔案存在,則將其覆蓋,否則建立新檔案
wb 以二進位制格式開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 檔案存在,則將其覆蓋,否則建立新檔案
w+ 開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 檔案存在,則將其覆蓋,否則建立新檔案
wb+ 以二進位制格式開啟一個檔案用於讀寫。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。 檔案存在,則將其覆蓋,否則建立新檔案
a 開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。 檔案存在,則追加,否則建立新檔案
ab 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。 檔案存在,則追加,否則建立新檔案
a+ 開啟一個檔案用於讀寫。如果該檔案已存在,檔案指標將會放在檔案的結尾。檔案開啟時會是追加模式。如果該檔案不存在,建立新檔案用於讀寫。 檔案存在,則追加,否則建立新檔案
ab+ 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果該檔案不存在,建立新檔案用於讀寫。 檔案存在,則追加,否則建立新檔案

示例程式碼:

在D盤建立a.txt內容如下:

1
2
3
file = open('D:\\a.txt', 'r')
for i in file:
    print(i)

file.close()

執行結果:
	1
	
	2
	
	3

注意:檔案使用完畢後一定要進行關閉

開啟檔案時指定編碼方式

在使用open()函式開啟檔案時,預設採用GBK編碼,當被開啟的檔案不是GBK時,將會丟擲UnicodeDecodeError異常,解決方法如下:

file = open('D:\\a.txt', 'r',encoding='utf-8')

使用with語句開啟檔案

開啟檔案後,要及時將其關閉,如果忘記關閉可能帶來意想不到的問題,另外,如果在開啟檔案時丟擲了異常,那麼將導致檔案不能被及時關閉。為了更好的避免此類問題發生,可以使用Python提供的with語句,從而實現在處理時,無論是否丟擲異常,都能保證with語句執行完畢後關閉已經開啟的檔案。

with open(file) as target:
	with-body
  • file:開啟的檔案及路徑
  • target:用於指定一個變數,並且將開啟的檔案內容儲存到該變數
  • with-body:用於指定with語句體,其中可以是執行with語句後相關的操作語句

示例程式碼:

with open('D:\\a.txt', 'r') as file:
    value = file.read()  # 讀取整個檔案內容
    print(value)

執行結果:
	1
	2
	3

寫入檔案內容

file.write(string)
  • file:為開啟的檔案物件
  • string:為要寫入的字串

方式1:

lists = ("今天的排程:", "1-起床", "2-吃早餐", "3-爬山")

with open('D:\\a.txt', 'a') as file:  # 建立檔案並追加寫入
    for i in range(len(lists)):
        value = file.write(lists[i]+'\n')

開啟a.txt

今天的排程:
1-起床
2-吃早餐
3-爬山

方式2:

file = open('D:\\a.txt', 'a')
for i in range(len(lists)):
    value = file.write(lists[i]+'\n')

file.close()

開啟a.txt

今天的排程:
1-起床
2-吃早餐
3-爬山

注意: 在方式2時,一定要呼叫close()方法關閉檔案,否則寫入的內容不會儲存到資料夾中。這是因為當我們寫入檔案內容時,作業系統不會立刻把資料寫入磁碟,而是先快取起來,只有呼叫close()方法時,作業系統才會保證把沒有寫入的資料全部寫入磁碟。

模式 實現方式
w(寫入) 先清空原檔案中的內容,再寫入新的內容
a(追加) 在檔案追加內容

讀取檔案

file.read(size)
  • file:為開啟的檔案物件
  • size:可選引數,用於指定要讀取的字元個數,如果省略,則一次性讀取所有內容

讀取上面的a.txt

with open('D:\\a.txt', 'r') as file2:
    value = file2.read(12)  # 開啟前12個字元
    print(value)

執行結果:
	今天的排程:
	1-起床

注意:

  • \n(換行也算兩個字元))
  • 檔案必須為開啟模式(r 或 r+)

從指定位置讀取檔案

使用seek()

file.seek(offset, whence)
  • file:表示已開啟的檔案物件
  • offset:用於指定移動的字元個數
  • whence:用於指定從什麼位置開始計算(0表示從檔案頭開始計算,1表示從當前位置開始計算,2表示從檔案尾開始計算,預設為0)

示例程式碼:

a.txt內容如下

1234567891011121314151617181920212223242526272829

從第19位開始讀取,讀取10個字元。

with open('D:\\a.txt', 'r') as file2:
    file2.seek(19)  # 從檔案頭到第19個字元開始讀取
    value = file2.read(10)  # 讀取10個字元,檔案必須為開啟模式:r或r+
    print(value)

執行結果:
	1516171819

讀取一行

file.readline()

a.txt內容

今天的排程:
1-起床
2-吃早餐
3-爬山

示例程式碼:

with open('D:\\a.txt', 'r') as file2:
    value = file2.readline()  # 讀取10個字元,檔案必須為開啟模式:r或r+
    print(value)

執行結果:
	今天的排程:

讀取全部行

file.readlines()

readlines()和read()不指定size類似,只不過readlines()返回的是一個字串列表。

a.txt內容

今天的排程:
1-起床
2-吃早餐
3-爬山

示例程式碼:

with open('D:\\a.txt', 'r') as file2:
    value = file2.readlines()  # 讀取10個字元,檔案必須為開啟模式:r或r+
    print(value)

執行結果:
	['今天的排程:\n', '1-起床\n', '2-吃早餐\n', '3-爬山\n']