1. 程式人生 > 實用技巧 >全棧測試 一 | py3基礎 三 :file物件測試資料的讀寫與操作

全棧測試 一 | py3基礎 三 :file物件測試資料的讀寫與操作

檔案的開啟方式


開啟方式

詳細釋義

r

以只讀方式開啟檔案。檔案的指標會放在檔案的開頭。這是預設模式。

rb

以二進位制只讀方式開啟一個檔案。檔案指標會放在檔案的開頭。

r+

以讀寫方式開啟一個檔案。檔案指標將會放在檔案的開頭。(讀取檔案時,只能讀,不能新建,如果檔案沒有,則會異常報錯)

rb+

以二進位制讀寫方式開啟一個檔案。檔案指標會放在檔案的開頭。

w

以寫入方式開啟一個檔案。如果該檔案已存在,則將其覆蓋。如果該檔案不存在,則建立新檔案

wb

以二進位制寫入方式開啟一個檔案。如果該檔案已存在,則將其覆蓋。如果該檔案不存在,則建立新檔案

w+

以讀寫方式開啟一個檔案。如果該檔案已存在,則將其覆蓋。如果該檔案不存在,則建立新檔案

wb+

以二進位制讀寫方式開啟一個檔案。如果該檔案已存在,則將其覆蓋。如果該檔案不存在,則建立新檔案

a

以追加方式開啟一個檔案。如果該檔案已存在,檔案指標將會放在檔案尾,新的內容會寫入到已有內容之後,如果該檔案不存在,則建立新檔案來寫入

ab

以二進位制追加方式開啟一個檔案。如果該檔案已存在,檔案指標將會放在檔案尾,新的內容會寫入到已有內容之後,如果該檔案不存在,則建立新檔案來寫入

a+

以讀寫方式開啟一個檔案,如果該檔案已存在,檔案指標將會放在檔案尾,新的內容會寫入到已有內容之後,如果該檔案不存在,則建立新檔案來寫入

ab+

以二進位制追加方式開啟一個檔案。如果該檔案已存在,檔案指標將會放在檔案尾,新的內容會寫入到已有內容之後,如果該檔案不存在,則建立新檔案來寫入

檔案的讀操作


示例:

 1 print("->檔案控制代碼的獲取,讀操作:")

 2

 3 f = open('無題','r',encoding='utf8') #此行作用就是獲取檔案控制代碼

 4 d = f.read()    #read方法讀取檔案所有內容

 5 f.close()

 6 print(d)

 7

 8 print('->例二:
') 9 f = open('無題','r',encoding='utf8') 10 e = f.read(9) #read方法中索引表示讀取字元數 11 f.close() 12 print(e) 13 #python3中,檔案中一箇中英文都佔位1 執行結果: ->檔案控制代碼的獲取,讀操作: 昨夜星辰昨夜風 畫樓西畔桂堂東 身無綵鳳雙飛翼 心有靈犀一點通 ->例二: 昨夜星辰昨夜風 畫

檔案的寫操作


知識點:

    1.寫操作前,檔案先格式化清空檔案

    2.清空操作,在執行open的w方法後,清空

1 print("寫的操作,寫檔案的時候,不能呼叫讀方法,讀檔案的時候,不能呼叫寫方法")

2

3 f = open('python','w',encoding='utf8')

4 f.write("I must learn python \nbecause, python is important \n")

5 f.write("java is better?")

6 f.write("maybe") #上面的語句,沒有加換行符,所以輸出的內容是緊接的

7 f.close()

執行結果:

開啟檔案後顯示如下

I must learn python

because, python is important

java is better?maybe

檔案的append方法


語法格式:

f = open('檔名','a','encoding = utf8')

檔案這種方法為追加模式:1, 空白檔案中,直接從頭開始寫入內容; 2 有內容的檔案,會在末尾開始繼續寫入內容

示例:

f = open('python','a',encoding='utf8')

f.write("花開又花落")

f.close()

執行結果:

I must learn python

because, python is important

java is better?maybe花開又花落

readline readlines


readline是逐行讀取

readlines是全文讀取


示例1readline示例:

# -*- coding:utf-8 -*-

'''

實際的工作中,使用的方法幾乎為readline方法

'''

print("readline方法")

f = open('無題','r',encoding='utf-8')

a = f.readline() #讀取一行內容

print("此時游標位置:",f.tell())

b = f.readline() #繼續讀取一行內容

print("此時游標位置:",f.tell())

print(a.strip()) #strip是字串方法中去除空格和換行的方法

print(b.strip())

執行結果:

readline方法

此時游標位置: 23

此時游標位置: 46

昨夜星辰昨夜風

畫樓西畔桂堂東

我讀取的檔案內容原件:

昨夜星辰昨夜風

畫樓西畔桂堂東

身無綵鳳雙飛翼

心有靈犀一點通

南京

江蘇

中國


示例2檔案內容的遍歷示例:

#遍歷檔案,在第四行列印分割線,然後繼續迴圈

count = 0

f = open('無題','r',encoding='utf-8')

for line in f:

if count == 3:

print('%%%%####%%%%')

count+=1

continue

print(line.strip())

count+=1

f.close()

執行結果:

昨夜星辰昨夜風

畫樓西畔桂堂東

身無綵鳳雙飛翼

%%%%####%%%%

南京

江蘇

中國


示例3readlines方法:

print("readlines方法,會將每行的內容組成一個列表列印")

f = open('無題','r',encoding='utf8')

c = f.readlines()

print(c)

print(id(c))

print(id(f))

for i in c:

print(i.strip())

print("遍歷方法")

f.seek(0) #將檔案指標設定到初始位置,就是檔案開頭

for i in f:

print(i.strip())

f.close() #檔案的操作中,close()方法一定不能忘記

執行結果:

readlines方法,會將每行的內容組成一個列表列印

['昨夜星辰昨夜風\n', '畫樓西畔桂堂東\n', '身無綵鳳雙飛翼\n', '心有靈犀一點通\n', '南京\n', '江蘇\n', '中國']

38154568

3902272

昨夜星辰昨夜風

畫樓西畔桂堂東

身無綵鳳雙飛翼

心有靈犀一點通

南京

江蘇

中國

遍歷方法

昨夜星辰昨夜風

畫樓西畔桂堂東

身無綵鳳雙飛翼

心有靈犀一點通

南京

江蘇

中國

檔案的tell() seek()方法


示例:

f = open('無題','r',encoding='utf8')

f.read(4)

print('當前游標位置',f.tell())

f.seek(10)

print('當前游標位置',f.tell())

f.close()

#read時,一箇中文算三個字元

執行結果:

當前游標位置 12

當前游標位置 10

檔案操作之flush方法


import sys,time

 

for i in range(20):

    sys.stdout.write("#")

    sys.stdout.flush()

    time.sleep(1)

truncate方法


f = open('test','w')

f.write("hello")

f.write("\n")

f.write("python")

f.flush() #這樣不用執行close方法,記憶體中的資料,就會寫入到disk

f.close()

 

f = open('test','a')

f.truncate(2)  #截斷方法,游標從2開始往後擷取

f.close()

檔案常用的方法彙總如下:

#-- 檔案基本操作 

    output = open(r'C:\spam', 'w')          # 開啟輸出檔案,用於寫 

    input = open('data', 'r')               # 開啟輸入檔案,用於讀。開啟的方式可以為'w', 'r', 'a', 'wb', 'rb', 'ab'等 

    fp.read([size])                         # size為讀取的長度,以byte為單位 

    fp.readline([size])                     # 讀一行,如果定義了size,有可能返回的只是一行的一部分 

    fp.readlines([size])                    # 把檔案每一行作為一個list的一個成員,並返回這個list。其實它的內部是通過迴圈呼叫readline()來實現的。如果提供size引數,size是表示讀取內容的總長。 

    fp.readable()                           # 是否可讀 

    fp.write(str)                           # 把str寫到檔案中,write()並不會在str後加上一個換行符 

    fp.writelines(seq)                      # 把seq的內容全部寫到檔案中(多行一次性寫入) 

    fp.writeable()                          # 是否可寫 

    fp.close()                              # 關閉檔案。 

    fp.flush()                              # 把緩衝區的內容寫入硬碟 

    fp.fileno()                             # 返回一個長整型的”檔案標籤“ 

    fp.isatty()                             # 檔案是否是一個終端裝置檔案(unix系統中的) 

    fp.tell()                               # 返回檔案操作標記的當前位置,以檔案的開頭為原點 

    fp.next()                               # 返回下一行,並將檔案操作標記位移到下一行。把一個file用於for … in file這樣的語句時,就是呼叫next()函式來實現遍歷的。 

    fp.seek(offset[,whence])                # 將檔案打操作標記移到offset的位置。whence可以為0表示從頭開始計算,1表示以當前位置為原點計算。2表示以檔案末尾為原點進行計算。 

    fp.seekable()                           # 是否可以seek 

    fp.truncate([size])                     # 把檔案裁成規定的大小,預設的是裁到當前檔案操作標記的位置。 

    for line in open('data'):  

        print(line)                         # 使用for語句,比較適用於開啟比較大的檔案 

    open('f.txt', encoding = 'latin-1')     # Python3.x Unicode文字檔案 

    open('f.bin', 'rb')                     # Python3.x 二進位制bytes檔案 

    # 檔案物件還有相應的屬性:buffer closed encoding errors line_buffering name newlines等