1. 程式人生 > >Python3對檔案的操作

Python3對檔案的操作

前言:不知道大家中秋小假過得怎樣?反正我是在寢室睡了3天,其間爬下床看了點python3對檔案操作的相關知識。還是有很多收穫的,總結一下。
番外:在瞭解python3對檔案的操作之前,先要了解python3.x和python2.x的區別。我主要介紹下編碼的區別。
因為本人純菜鳥,在此之前,也要對編碼有了點基本的瞭解。
計算機中,目前用的最廣泛,也是最基本的,算是ASCII字元編碼了。1.ASCII就是我們最常見的,26個英文字母,加上常見的那些字元等等,加起來的,字元編碼;
2.而我們常見的GBK(XXX)型別字元編碼,就是簡體中文字元編碼;
3.對於臺灣等地區,都是用的是繁體中文,繁體中文一般都是用的是BIG5,中文一般稱為大五碼,其對應者微軟的CP950;
4.歐洲地區的字元編碼,一般是ISO(XXX);
5.字元編碼發展到最後,要考慮的問題是:最好用,單獨的,某個字元編碼,可以囊括世界上所有的字元,包括以後可能出現的字元此種編碼,就是後來的Unicode。
再來說Unicode和UTF-8,UTF-16等的關係,Unicode,只是一個字符集的概念,即表示,設計了一套邏輯,可以用不同的值,表示不同的字元,這個是Unicode標準做的事情,即支援了所有的字元;但是,要把Unicode,在計算機中實現出來,表示出來,以及把Unicode字元,從從一個地方傳送到別的地方,即字元交換,則涉及到,實際上所採用的字元編碼;把字符集Unicode表示出來的字元編碼,有多種,最常見的有,UTF-8和UTF-16,次常見的還有UTF-32。
即:Unicode是字符集的概念,UTF-8,UTF-16是字元編碼的概念;UTF-8,UTF-16等,只是Unicode的實現方式之一。

再來回歸我們的主題,在python2.x中主要有str和Unicode兩種字串型別。比如’abc’是str,u’你好’則是unicode。
而到python3中改為了bytes和str,(bytes型別其實就是二進位制資料),所以特別是在對檔案進行操作時,如果設定是二進位制方式開啟,會有b”。
1.開啟檔案:
fp = open(filename,mode)
filename是檔名。
mode是檔案的開啟方式。預設是r+。主要引數有r–只讀,w–新建寫,a–追加,(+)–可寫,b–二進位制方式。常用的有r+ – 讀寫模式開啟,rb+ – 二進位制讀寫模式,wb+ – 二進位制格式開啟,用於讀寫,若檔案已存在則覆蓋,不存在則新建,a+ – 追加寫。

2.讀取檔案
read(size): 讀取size的位元組數。size為空時,讀取檔案所有位元組。
readlines(size):把讀取到的值放在列表裡儲存並返回列表值。size並不是單純的位元組數,匹配到的是隻要是大於某一行起始值的都會讀出整行。
readline(size):若當前行的值大於size,則讀當size值。若小於,則返回
當前行。為空則返回整行。
迭代器:檔案本身可以看做一個迭代器,迴圈操作。像下面這樣迴圈遍歷就可以全部讀出了。

f = open("foo.txt")
for i in f:
    print (i)

在檔案內容比較大時,使用迭代器可以在不消耗大量記憶體的情況下,對檔案進行操作。

3.檔案寫入
1.write(str):將字串寫入檔案,一般情況下寫入可以直接:

write("lily")

二進位制模式下寫入,需要轉換編碼格式,可以如下寫入:(稍微解釋下decode()和encode(),他們是分別進行解碼和編碼的)

bytes —-decode()—-> str(unicode)—encode()—>bytes

f.write(bytes("lily",'utf-8'))
or 
f.write("lily".encode())

2.writelines(sequence_of_strings):寫多行到檔案。

4.檔案關閉與緩衝
需要注意的是,下面的程式碼並不能讀出檔案內容。因為檔案寫入後存在一定的緩衝,並沒有寫到系統磁盤裡面,所以不能直接讀取。需要關閉後再開啟讀取。

f = open("foo.txt",'w+')
f.write('111')
# f.close() (如果沒有關閉檔案,是讀取不到的)
# f = open("foo.txt")
fr=f.read()
print (fr)

5.檔案指標
檔案指標的理解也是非常重要的。

f = open("foo.txt",'r+')
fr=f.read()
f.close()
print (fr)
# fr:0123456789abcdef

f = open("foo.txt",'r+')
fr1=f.read(3)
fr2=f.read(3)
print (fr1)
print (fr2)
# fr1:012
# fr2:345

如上程式碼,可以知道foo.txt裡的內容是“0123456789abcdef”,用read()讀出的f1和f2分別是“012”和“345”,可知,用read()讀取之後,檔案指標的位置也相應地後移。
檔案指標的操作方法:
tell():檢視檔案指標當前的位置。
seek(offset[,whence]):可以用來移動檔案指標。
offset偏移量;
whence偏移相對位置,分別有:os.SEEK_SET(相對檔案起始位置,也可用“0”表示);os.SEEK_CUR(相對檔案當前位置,也可用“1”表示);os.SEEK_END(相對檔案結尾位置,也可用“2”表示)。
還是上面的例子:

fr1=f.read(3)
print(fr1) 
#fr1=012 讀取三個位元組
ft2=f.tell()
print (ft2)
#fr2=3  當前指標所指位置是3
fes=f.seek(2,os.SEEK_SET)
ft3=f.tell()
print (ft3)
#fr3=2   相對起始位置偏移了2個位元組,當前指標是2

當然,偏移量也可以為負數,大家可以自己動作做一做。
斷斷續續,終於寫完了。。。。