『無為則無心』Python基礎 — 43、檔案備份的實現

繁華似錦Fighting發表於2022-01-28

1、需求

使用者輸入當前目錄下任意檔名,程式完成對該檔案的備份功能。

備份檔名為xx[備份]字尾,例如:test[備份].txt

2、步驟

  1. 接收使用者輸入的檔名。
  2. 規劃備份檔名。
  3. 備份檔案寫入資料。

3、程式碼實現

(1)接收使用者輸入目標檔名

old_name = input('請輸入您要備份的檔名:')

(2)規劃備份檔名

2.1 提取目標檔案字尾。
2.2 組織備份的檔名,xx[備份]字尾。

# 2.1 提取檔案字尾點的下標
index = old_name.rfind('.')

# 2.2 組織新檔名 舊檔名 + [備份] + 字尾
new_name = old_name[:index] + '[備份]' + old_name[index:]

(3)備份檔案寫入資料

3.1 開啟原始檔 和 備份檔案。
3.2 將原始檔資料寫入備份檔案。
3.3 關閉檔案。

# 3.1 開啟檔案
old_f = open(old_name, 'rb')
new_f = open(new_name, 'wb')

# 3.2 將原始檔資料寫入備份檔案
# 如果不確定目標檔案大小,迴圈讀取寫入,
# 當讀取出來的資料沒有了終止迴圈
while True:
    # 每次在原檔案中讀取的內容
    con = old_f.read(1024)
    # 表示讀取完成了
    if len(con) == 0:
        # 終止讀取
        break

    # 新檔案寫入讀取的資料
    new_f.write(con)

# 3.3 關閉檔案
old_f.close()
new_f.close()

(4)思考

如果使用者輸入.txt,這是一個無效檔案,程式如何更改才能限制只有有效的檔名才能備份?

答:新增條件判斷即可。

# 有檔名,才能提取字尾
# 這裡無法取得字尾,拼接的時候沒有字尾的變數
# 就會報錯
if index > 0:
    postfix = old_name[index:]

(5)完整編碼

1)傳統實現

# 1. 使用者輸入目標檔案  如:sound.txt.mp3
old_name = input('請輸入您要備份的檔名:')

# 2. 規劃備份檔案的名字
# 2.1 提取字尾 --
# 找到名字中的最右側的點才是字尾的點
# 在右側查詢rfind()方法
# 獲取檔案全名中字尾.的位置
index = old_name.rfind('.')


# 4. 思考:有效檔案才備份 .txt
if index > 0:
    # 提取字尾,這裡提取不到,後面拼接新檔名字的時候就會報錯
    postfix = old_name[index:]

# 2.2 組織新名字 = 原名字 + [備份] + 字尾
# 原名字就是字串中的一部分子串 -- 切片[開始:結束:步長]
# new_name = old_name[:index] + '[備份]' + old_name[index:]
new_name = old_name[:index] + '[備份]' + postfix


# 3. 備份檔案寫入資料(資料和原檔案一樣)
# 3.1 開啟 原檔案 和 備份檔案
old_f = open(old_name, 'rb')
new_f = open(new_name, 'wb')

# 3.2 原檔案讀取,備份檔案寫入
# 如果不確定目標檔案大小,迴圈讀取寫入,當讀取出來的資料沒有了終止迴圈
while True:
    # 每次在原檔案中讀取的內容
    con = old_f.read(1024)
    # 表示讀取完成了
    if len(con) == 0:
        # 終止讀取
        break

    # 新檔案寫入讀取的資料
    new_f.write(con)

# 3.3 關閉檔案
old_f.close()
new_f.close()

2)實際工作實現

# 1. 使用者輸入目標檔案  如:sound.txt.mp3
old_name = input('請輸入您要備份的檔名:')

# 獲取檔案全名中字尾.的位置
index = old_name.rfind('.')

# 4.有效檔案才備份 .txt
if index > 0:
    postfix = old_name[index:]

# 3.開始備份檔案
# 開啟原檔案
with open(old_name , 'rb') as file_obj:
    # 組織新名字 = 原名字 + [備份] + 字尾
    new_name = old_name[:index] + '[備份]' + postfix

    # 建立並開啟新檔案
    with open(new_name, 'wb') as new_obj:
        # 定義每次讀取的大小
        chunk = 1024 * 100

        while True:
            # 從已有的物件中讀取資料
            content = file_obj.read(chunk)

            # 內容讀取完畢,終止迴圈
            if not content:
                break

            # 將讀取到的資料寫入到新物件中
            new_obj.write(content)

兩種方式實現的功能一樣。

4、再來一個小練習

需求:二進位制檔案讀取(實現方式和上邊一樣)

# 讀取模式
# t 讀取文字檔案(預設值)
# b 讀取二進位制檔案

file_name = “hello.txt”

with open(file_name , 'rb') as file_obj:
    # 讀取文字檔案時,size是以字元為單位的
    # 讀取二進位制檔案時,size是以位元組為單位
    # print(file_obj.read(100))

    # 將讀取到的內容寫出來
    # 定義一個新的檔案
    new_name = 'aa.txt'

    with open(new_name , 'wb') as new_obj:

        # 定義每次讀取的大小
        chunk = 1024 * 100

        while True :
            # 從已有的物件中讀取資料
            content = file_obj.read(chunk)

            # 內容讀取完畢,終止迴圈
            if not content :
                break

            # 將讀取到的資料寫入到新物件中
            new_obj.write(content)

注意:純文字檔案也可以使用二進位制方法進行讀取操作。

相關文章