1、需求
使用者輸入當前目錄下任意檔名,程式完成對該檔案的備份功能。
備份檔名為xx[備份]字尾
,例如:test[備份].txt
。
2、步驟
- 接收使用者輸入的檔名。
- 規劃備份檔名。
- 備份檔案寫入資料。
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)
注意:純文字檔案也可以使用二進位制方法進行讀取操作。