1. 程式人生 > >python語法(四)— 檔案操作

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

 

 

 

 

 

 

 

 

 

 

Herrt灬凌夜:https://www.cnblogs.com/wuyx/