1. 程式人生 > 實用技巧 >Kubernetes的資源控制器和Service(四)

Kubernetes的資源控制器和Service(四)

1、檔案操作的流程:

1.1 檔案的定義:

檔案就是作業系統提供給應用程式來操作硬碟的介面,使用者或應用程式對檔案的操作,就是向作業系統發起呼叫,然後由作業系統完成對硬碟的具體操作。

1.2 操作檔案的基本流程:

1. 開啟檔案,由應用程式向作業系統發起系統呼叫open(...),作業系統開啟該檔案,對應一塊硬碟空間,並返回一個檔案物件賦值給一個變數f
#open('檔案的路徑',mode = "開啟檔案的模式",encoding ="操作檔案的字元編碼")
#預設開啟檔案的模式是rt模式,r代表只讀,t代表文字檔案,預設的開啟檔案的編碼是: win:gbk  linux:utf-8  mac: utf-8
f = open('a.txt',mode='r',encoding='utf-8') #預設開啟模式就為r 2. 呼叫檔案物件下的讀/寫方法,會被作業系統轉換為讀/寫硬碟的操作 data = f.read() 3. 向作業系統發起關閉檔案的請求,回收系統資源 f.close()

2、相對路徑和絕對路徑:

相對路徑:a.txt必須與當前py檔案在同一級目錄(一般使用相對路徑)
絕對路徑: 要找到根目錄的路徑

3、資源回收 與 with上下文管理

開啟一個檔案包含兩部分資源:應用程式的變數f和作業系統開啟的檔案。在操作完畢一個檔案時,必須把與該檔案的這兩部分資源全部回收,回收方法為
1、f.close() #回收作業系統開啟的檔案資源 2、del f #回收應用程式級的變數

其中 del f一定要發生在f.close()之後,否則就會導致作業系統開啟的檔案無法關閉,白白佔用資源,而python自動的垃圾回收機制決定了我們無需考慮del f,這就要求我們,在操作完畢檔案後,一定要記住f.close()。

with 可以自動幫你回收作業系統的資源,無需自己操作

with open('a.txt',mode='r',encoding='utf-8') as f:      

可用with同時開啟多個檔案,用逗號分隔開即可
with open('a.txt','r') as f1,open('b.txt','r') as f2: 

4、開啟檔案的三種模式:

r:只讀    注意:當要開啟的檔案不存在時,會報錯
with open(
'a.txt',mode='r',encoding='utf-8') as f: #with 可以不用關心關檔案了 print(f.read()) #讀取檔案,一次性讀出所有資料 print(f.readline()) #一行行讀,執行一次,列印一行內容 print(f.readlines()) #返回成列表的形式 print(f.readable()) #判斷檔案是否可讀 with open('a.txt',mode='r',encoding='utf-8') as f: for line in f: print(line,end="") #文字檔案裡本身就有隱藏的換行符,而print又自帶就有一個換行符,所以每行之間有空行
w:只寫      如果檔案不存在,則新建一個檔案,如果檔案記憶體在資料,會清空資料,重新寫入 
f = open('a'.txt,mode='w',encoding='utf-8')
print(f.write())
print(f.writable())   #判斷檔案是否可寫
print(f.writelines())    #for+f.write()
a:追加寫    如果檔案記憶體在資料,會在已有資料後面追加資料,如果檔案不存在,會新建一個檔案寫
f = open('a'.txt,mode='a',encoding='utf-8')
print(f.write())

5、處理檔案的模式

大前提: t、b模式均不能單獨使用,必須與r/w/a之一結合使用

t(預設的):文字模式
        1. 讀寫檔案都是以字串為單位的
        2. 只能針對文字檔案
        3. 必須指定encoding引數
    

b:二進位制模式:
           1.讀寫檔案都是以bytes/二進位制為單位的
           2. 可以針對所有檔案
           3. 一定不能指定encoding引數
               
強調:b模式對比t模式
    1、在操作純文字檔案方面t模式幫我們省去了編碼與解碼的環節,b模式則需要手動編碼與解碼,所以此時t模式更為方便
    2、針對非文字檔案(如圖片、視訊、音訊等)只能使用b模式


注意:1.rb模式讀文字檔案需要解碼
with open('b.txt',mode='rb') as f:
    data=f.read()
    print(data.decode('utf-8'))
     2.wb模式寫文字檔案需要編碼
with open('b.txt',mode='wb') as f:
    data='111'
    f.write(data.encode('utf-8'))

6、控制檔案內游標的移動

大前提:檔案內指標的移動都是Bytes為單位的,唯一例外的是t模式下的read(n),n以字元為單位(f.writes()照樣是按照bytes來算!)

with open('a.txt',mode='rt',encoding='utf-8') as f:
     data=f.read(3) # 讀取3個字元
     
with open('b.txt', mode='rb') as f:
    print(f.read(3))  # 讀取3個Bytes


f.seek  (offset,whence)
offset:相對偏移度(游標移動的位數)
whence:指定游標位置從何開始
    0:從檔案開頭
    1:從當前位置
    2:從檔案末尾
    
強調:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用

如:
a.txt用utf-8編碼,內容如下(abc各佔1個位元組,中文“你好”各佔3個位元組)
abc你好
# 0模式的使用
with open('a.txt',mode='rt',encoding='utf-8') as f:
    f.seek(3,0)     # 參照檔案開頭移動了3個位元組
    print(f.tell()) # 檢視當前檔案指標距離檔案開頭的位置,輸出結果為3
    print(f.read()) # 從第3個位元組的位置讀到檔案末尾,輸出結果為:你好
    # 注意:由於在t模式下,會將讀取的內容自動解碼,所以必須保證讀取的內容是一個完整中文資料,否則解碼失敗

with open('a.txt',mode='rb') as f:
    f.seek(6,0)
    print(f.read().decode('utf-8')) #輸出結果為: 好

# 1模式的使用:
with open('b.txt',mode='rb') as f:
    f.seek(3,1) # 從當前位置往後移動3個位元組,而此時的當前位置就是檔案開頭
    print(f.tell()) # 輸出結果為:3
    f.seek(4,1)     # 從當前位置往後移動4個位元組,而此時的當前位置為3
    print(f.tell()) # 輸出結果為:7
    

# 2模式的使用
with open('a.txt',mode='rb') as f:
    f.seek(0,2)     # 參照檔案末尾移動0個位元組, 即直接跳到檔案末尾
    print(f.tell()) # 輸出結果為:9
    f.seek(-3,2)     # 參照檔案末尾往前移動了3個位元組
    print(f.read().decode('utf-8')) # 輸出結果為:好

6、檔案的修改

強調
1、硬碟空間是無法修改的,硬碟中資料的更新都是用新內容覆蓋舊內容
2、記憶體中的資料是可以修改的

檔案a.txt原內容:
你好我是你爸爸

with open('a.txt',mode='r+t',encoding='utf-8') as f:
    f.seek(3)
    f.write('嗡嗡嗡')
    
檔案a.txt修改後內容:
你嗡嗡嗡你爸爸

6.1 檔案修改方式一:

實現思路:
1、將檔案內容發一次性全部讀入記憶體
2、在記憶體中修改完畢
3、再把修改後的結果覆蓋寫回原檔案

優點: 在檔案修改過程中同一份資料只有一份
缺點: 會過多地佔用記憶體
with open('db.txt',mode='rt',encoding='utf-8') as f:
    data=f.read()

with open('db.txt',mode='wt',encoding='utf-8') as f:
    f.write(data.replace('kevin','SB'))

6.2 檔案修改方式二:

import os
with open('b.txt',mode='rt',encoding='utf-8') as rf,\
        open('c.txt',mode = 'wt',encoding='utf-8') as wf:
    for line in rf:
        wf.write(line.replace('SB','kevin'))

os.remove('b.txt')
os.rename('c.txt','b.txt')