Python檔案操作
阿新 • • 發佈:2018-12-13
建立和開啟檔案
普通開啟方式
在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']