python語法(四)— 檔案操作
前面幾天學習了一寫python的基礎語法,也學習了分支if,迴圈while和for。由於之前已經做過幾年的開發了,所以我們知道,許多資料來源並不是靠鍵盤輸入到程式中去的,而是通過資料庫和檔案來獲取到的,那麼今天就來學習檔案物件。
一、檔案的開啟(open()和file())
python 中為我們提供了兩種開啟檔案的方式,分別是open()函式和file()函式,為我們提供了初始化輸入/輸出(I/O)操作的通用方法,當我們開啟一個檔案時會返回一個檔案物件,但是這裡需要注意的是,如果檔案不存在,是會丟擲異常的。而且file()函式和open()函式是一致的,可以互相替換。
- 基礎語法
file = open('file_location', access_mode='r', buffering=-1)
其中三個引數分別代表了,檔案路徑,這裡可以是相對路徑,也可以是絕對路徑,第二個引數是表示開啟檔案的模式,第三個引數是開始的位置。
- 檔案模式
檔案模式 | 操作 |
---|---|
r | 以讀的方式開啟,如果檔案不存在則丟擲異常。檔案可以不寫開啟模式,模式是以r的方式開啟。 |
w | 以寫的方式開啟,如果檔案存在則清空檔案內的內容,如果檔案不存在,則建立檔案。 |
a | 以追加模式開啟檔案,如果檔案存在則追加內容如果檔案不存在則建立新檔案。 |
r+ | 以讀寫模式開啟,如果檔案不存在則丟擲異常 |
w+ | 以讀寫模式開啟,如果檔案存在則清空檔案內的內容,如果檔案不存在,則建立檔案。 |
a+ | 以讀寫模式開啟檔案,如果檔案存在則追加內容如果檔案不存在則建立新檔案。 |
二、檔案讀取 read 方法
read()方法是直接以位元組的方式來讀取檔案,將檔案讀取到字串中,可以給到讀取檔案的位元組數,如果文友給定,則預設為讀到檔案末尾為止,也就是-1.
- 語法
file = open("fileName"); data = file.read(); print(data); file.close();
如果一個檔案特別大,我們這樣去讀的話就會把檔案中的所有內容都會讀到記憶體中,這樣會導致我們的記憶體被撐爆,所有我們需要在這裡限制讀的大小,也就是在read()中加入引數,這裡引數表示位元組,我們一般是寫4096,也就是讀4096個位元組。為什麼是4096呢?因為,我們硬碟的分割槽格式化時,硬碟的一個分割槽最小簇是4096(4K),而且硬碟的工作效率比較低,所以當我們去定址時,最好是將這一個簇的空間的值都拿出來,這樣工作效率是最高的。
三、檔案讀取 readline 方法與 readLines 方法
readlin()方法只適用於文字檔案,因為他是讀取一行檔案。
- readlin()語法
file = open("fileName"); data = file.readlin(); file.close();
readlins()方法只適用於文字檔案,因為他是讀取剩下的所有行的檔案。
- readlins()語法
file = open("fileName"); data = file.readlins(); file.close();
四、檔案迭代
如果將文字檔案逐行進行處理,此時我們就需要結合迴圈去處理檔案。
我們來看個例子,讀取一個文字檔案,並且將其逐行輸出。
# -*- coding=utf-8 -*- ''' Created on 2018年12月23日 檔案 @author: Herrt灬凌夜 ''' file = open("C:\\Users\\Administrator\\Desktop\\testFile.txt"); for line in file : print(line, end=""); file.close();
我們將file的每一行賦值給line,然後輸出line。這裡需要注意的是print是自帶一個換行符的,所以我們在這裡要將print的換行符去掉。
五、檔案寫入 write 方法
write 方法與 read方法正好相反,它是將文字資料和二進位制資料寫入到檔案中,而在寫入的過程中,程式是不會自動加如結束語句,比如換行等等,這需要我們手動寫入。
- write 語法
file = open("fileName", "w"); data = file.write("content\n"); file.close();
這裡我們需要注意的是,我們使用write寫入檔案時,檔案並不會立刻寫入檔案中,而是首先存入快取中,當檔案達到比較大,比如4K時會自動往硬碟上寫,但是如果我們需要立刻將檔案寫入到檔案的話,我們就需要使用檔案的flush()方法,或者將檔案closer(),這樣,系統就會立刻將快取中的內容直接寫入到硬碟中。
六、檔案寫入 writelines([]) 方法
writelines方法,同樣是只適用於文字檔案,但是他的傳參是一個列表,可以將列表中的每一個元素寫入到檔案中。
我們看個例子:
file = open("C:\\Users\\Administrator\\Desktop\\testFile.txt", "a"); data = file.writelines(["這是第四行\n", "這是第五行\n"]); file.close();
七、練習
所謂熟能生巧,尤其我們剛剛開始學習語言更是需要多加練習,所以最後以一個例子來結束今天的學習。
模擬 cp 操作:
# -*- coding=utf-8 -*- ''' Created on 2018年12月23日 檔案 @author: Herrt灬凌夜 ''' srcFileLocation = "C:\\Users\\Administrator\\Desktop\\None和表示式.mp4"; dstFileLocation = "C:\\Users\\Administrator\\Desktop\\cpNone和表示式.mp4"; srcFile = open(srcFileLocation, "rb"); dstFile = open(dstFileLocation, "wb"); while True : data = srcFile.read(4096); if len(data) == 0 : break; print("1"); dstFile.write(data); srcFile.close(); dstFile.close();
我這裡是將一個視訊檔案做了一個拷貝操作,需要注意的是win的作業系統如果open()檔案要以位元組的方式開啟時,我們需要加個b表示以位元組方式開啟。
-------------------- END ---------------------
最後附上作者的微信公眾號地址和部落格地址
公眾號:wuyouxin_gzh