Python操作檔案

北門吹雪發表於2020-10-04

操作檔案的核心思路
  1. 確定操作檔案的路徑,是相當路徑還是絕對路徑
  2. 確定操作檔案的巨集觀方式,是檔案還是檔案
  3. 操作文字檔案,類似於字串的操作方法
  4. 操作二進位制檔案,主要用於網路傳輸、下載媒體檔案
  5. 通過 open 開啟檔案
  6. 通過 readwrite 方法讀寫檔案
  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()

  

相關文章