操作檔案的核心思路
1. 確定操作檔案的路徑,是相當路徑還是絕對路徑
2. 確定操作檔案的巨集觀方式,是讀檔案還是寫檔案
3. 操作文字檔案,類似於字串的操作方法
4. 操作二進位制檔案,主要用於網路傳輸、下載媒體檔案
5. 通過 open 開啟檔案
6. 通過 read 和 write 方法讀寫檔案
7. 對檔案操作完畢則關閉檔案
# 基本上對應文字檔案時按行處理,對於二進位制檔案按塊處理
# 我們把這中方式稱為 流處理,Linux上sed命令
# 我們也可以通過with關鍵字語塊結束從而自動關閉檔案
# 相對路徑是相對當前檔案路徑,絕對路徑是相對於根目錄
# 讀取檔案 file_name = "song.txt" # 讀取檔案, r 只讀模式, 讀取檔案需要指定文字檔案的字元編碼 f = open(file_name, "r", encoding="utf-8") # 讀取一行文字資料 line = f.readline() print(line) # 遍歷所有行 for line in f: print(line) # 獲取所有行的 # 因為讀指標已經移動到檔案的結束, 所有 readlines會返回空列表 # readlines會把檔案資料全部讀取進入記憶體,以換行符進行分割 lines = f.readlines() print(lines) # 移動讀指標到檔案開始, 移動是以位元組為單位 f.seek(0) lines = f.readlines() print(lines) # 檔案操作完畢,需要關閉檔案 f.close()
修改檔案的思路
1. 讀取原檔案
2. 新建臨時檔案
3. 讀一行修改一行,把修改好的檔案寫入臨時檔案
4. 修改完,用臨時檔案替換原檔案
使用者替換檔案內容的程式
1. 使用者通過 python replace.py old_str new_str filename 替換檔案內所有檔案
2. 替換完畢列印替換了多少次
import os def flow_change(filename, old=None, new=None): """流式修改檔案 讀原檔案,把修改寫入新檔案,讀完修改完則用新檔案替換掉原檔案 """ # 驗證檔案是否存在, old 和 new 是否有資料 replece_count = 0 if old and new and os.path.exists(filename): temporary_file = filename + "temp" with open(filename, "r", encoding="utf-8") as f_old, \ open(temporary_file, "w", encoding="utf-8") as f_new: # 流式遍歷檔案,讀取一行處理一行,寫入一行 for line in f_old: replece_count += line.count(old) temp_line = line.replace(old, new) f_new.write(temp_line) # 新檔案替換原檔案 os.replace(temporary_file, filename) # 返回替換次數 return replece_count if __name__ == '__main__': # 獲取命令列引數, 序列解包方式獲取資料, sys.argv[1:4] old, new, file_name = ['你卻未看過一眼', "那一眼成永遠", "song.txt"] # 模擬使用者命令列輸入 # 呼叫函式修改 flow_change(file_name, old, new)
使用者登入程式
1. 使用者輸入使用者名稱和密碼進行登入
2. 使用者資訊儲存在檔案內
3. 使用者登入時候輸錯3次密碼則鎖定使用者,下次不讓登入
class Login(object): """驗證使用者登入""" def __init__(self): self.__pwd_file = "user_pwd.txt" self.__pwd_data = self.get_pwd_data() self.__retries = {} def run(self): """模板方法模式, 組合其他方法""" while True: # 獲取使用者輸入 username = self.user_input("請輸入使用者名稱:") pwd = self.user_input("請輸入密碼") # 設定使用者嘗試次數 self.__retries.setdefault(username, 0) # 檢查使用者登入狀態 enter_status = self.check_user(username, pwd) # 使用者鎖定或嘗試次數達3次退出 if enter_status: break def check_user(self, username, pwd): """校驗使用者是否登入""" user_info = [i for i in self.__pwd_data if username in i] if user_info: user, user_pwd, is_enter = user_info[0] else: print("密碼或賬號錯誤") return # 檢查使用者的密碼 輸錯一次則嘗試加一 if pwd != user_pwd: self.__retries[username] += 1 print("賬號或密碼錯誤") # 檢查使用者是否鎖定或嘗試次數是否小於三次 if self.__retries[username] >= 2: self.lock_user(username) print("賬號{}已經鎖定,禁止登入".format(username)) return # 檢查賬戶是否鎖定 if is_enter == "0": print("賬號{}已經鎖定,禁止登入".format(username)) return print("你好{}, 登入成功".format(username)) return True def lock_user(self, username): """鎖定使用者""" result = [] for item in self.__pwd_data: user, user_pwd, is_enter = item if username == user: result.append("{} {} {}\n".format(username, user_pwd, "0")) else: result.append(" ".join(item) + "\n") self.__pwd_data = result # 寫入修改 self.write_change() def write_change(self): """寫入修改, 只有賬號鎖定時寫入修改""" temp_file = self.__pwd_file + "tmp" with open(temp_file, "w", encoding="utf-8") as f: f.writelines(self.__pwd_data) # 替換檔案 os.replace(temp_file, self.__pwd_file) def user_input(self, prompt): """獲取使用者輸入""" while True: data = input(prompt).strip() if data: return data def get_pwd_data(self): """獲取使用者儲存的資訊""" with open(self.__pwd_file, "r", encoding="utf-8") as f: pwd_data = [i.split() for i in f.readlines()] return pwd_data if __name__ == '__main__': login = Login() login.run()